Сортировка JTable и вывод отчета Jasper - PullRequest
2 голосов
/ 06 декабря 2011

В одном из приложений на базе Java Swing для настольных компьютеров я использую JTable, и я добавил функцию сортировки для столбца.Мне нужно отсортировать его в соответствии с числовыми значениями, добавленными пользователем, а затем получить вывод отчета яшмы.

В настоящее время после сортировки и печати отчета отчет не показывает отсортированный порядок.Но порядок, когда значения взяты из БД.Как мне распечатать отчет по порядку сортировки таблицы пользователя?

Это мой код генерации отчета о яшме

try {
    DefaultTableModel de = (DefaultTableModel)Dashboard.catalogTbl.getModel();
    JRTableModelDataSource jr = new JRTableModelDataSource(de);
    String reportName = reportPath + "reports/AuctionSale/Catalogue/catalouge_frm_tbl.jrxml";
    String compiledName = reportPath + "reports/AuctionSale/Catalogue/catalouge_frm_tbl.jasper";
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("Lot_No", "Lot No");
    params.put("Mark", "Mark");
    params.put("Invoice", "Invoice");
    params.put("Grade", "Grade");
    params.put("Weight", "Weight");
    params.put("Price", "Price");
    params.put("Buyer", "Buyer");
    JasperCompileManager.compileReportToFile(reportName, compiledName);
    JasperPrint jasperPrint = JasperFillManager.fillReport(compiledName, params, jr);
    JasperViewer.viewReport(jasperPrint, false);
} catch (Exception e) {
    e.printStackTrace();
}

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011

@ Робин ответ в основном правильно, просто перевод на яшмы говорят :-)

«Декоратор» - это пользовательская реализация JRDataSource или (здесь) JRRewindableDataSource. Сделайте его только для данных и основывайтесь на RowSorter таблицы, что-то вроде (будьте осторожны: только что скомпилировано, а не протестировано!)

public class JRTableSorterDataSource implements JRRewindableDataSource {

    private RowSorter<? extends TableModel> sorter;

    private int currentRow = -1;

    private HashMap<String, Integer> columnNames = new HashMap<String, Integer>();

    public JRTableSorterDataSource(RowSorter<? extends TableModel> sorter) {
        if (sorter == null) return; // do nothing, no sorter
        this.sorter = sorter;
        TableModel tableModel = sorter.getModel();
        if (tableModel != null) {
            for (int i = 0; i < tableModel.getColumnCount(); i++) {
                this.columnNames.put(tableModel.getColumnName(i),
                        Integer.valueOf(i));
            }
        }

    }

    @Override
    public Object getFieldValue(JRField field) throws JRException {
        String fieldName = field.getName();
        Integer columnIndex = this.columnNames.get(fieldName);
        return sorter.getModel().getValueAt(sorter.convertRowIndexToModel(currentRow), columnIndex.intValue());
    }


    @Override
    public boolean next() throws JRException {
        if (sorter == null || sorter.getModel() == null)
            return false;
        this.currentRow++;
        return (this.currentRow < sorter.getViewRowCount());
    }

    @Override
    public void moveFirst() throws JRException {
        this.currentRow = -1;
    }

    protected int getColumnIndex(JRField field) throws JRException {
        String fieldName = field.getName();
        Integer columnIndex = this.columnNames.get(fieldName);

        if (columnIndex != null) {
            return columnIndex;
        } else if (fieldName.startsWith("COLUMN_")) {
            return Integer.parseInt(fieldName.substring(7));
        }
        throw new JRException("Unknown column name : " + fieldName);
    }

}

Затем используйте его при настройке отчета:

JRDataSource jr = new JRTableSorterDataSource(Dashboard.catalogTbl.getRowSorter());
/// ... same as your example

Редактировать

просто очень быстрый исполняемый фрагмент (слишком ленив, чтобы сделать полный отчет, забыл, как работают эти файлы ;-) - поэтому здесь мы создаем таблицу (со стандартной моделью SwingX), создаем источник данных на его RowSorter и зацикливаемся Значения первого столбца, без проблем:

    JTable table = new JXTable(new AncientSwingTeam());
    JRDataSource source = new JRTableSorterDataSource(table.getRowSorter());
    table.getRowSorter().toggleSortOrder(0);
    JRField field = createField("First Name");
    String firstNames = "First Name: ";
    while (source.next()) {
        firstNames += "\n  " + source.getFieldValue(field);
    }
    LOG.info(firstNames);
2 голосов
/ 06 декабря 2011

Полагаю, отчет создается на основе TableModel, тогда как типичная сортировка влияет только на сам JTable, а не на модель.

Что вы можете сделать, это украсить табличную модель, которую вы передаете генератору отчетов, чтобы он принял порядок ваших JTable. Нечто в стиле

public class TableModelDecorator implements TableModel{
  private TableModel delegate;
  private JTable table;

  @Override
  public Object getValueAt( int rowIndex, int columnIndex ) {
    return delegate.getValueAt( table.convertRowIndexToView( rowIndex ), table.convertColumnIndexToView( columnIndex ) );
  }
}

но тогда для всех соответствующих методов.

0 голосов
/ 21 ноября 2018

Что-то поздно, но я надеюсь, что кому-то это поможет:

В этом коде я делаю следующее: после применения фильтров в jTable1 размещаем строки, полученные во вспомогательной модели.

Затем я присвоил вспомогательную модель вспомогательной таблице.И именно эту таблицу я отправлю в JasperReports.

//** jTable1 is the table in the jFrame where the data is loaded and I apply
//the RowFilter or RowSorter filters

    DefaultTableModel dataModel_tableFiltered = null; //auxiliary model
    JTable tableAuxiliary = null; //table where we will put the auxiliary model

    public constructor {
            
        dataModel_tableFiltered = new DefaultTableModel ();
        // Set the number and name of the columns in the auxiliary model
        for (int i = 0; i <jTable1.getColumnCount(); i ++) {
            dataModel_tableFiltered.addColumn(jTable1.getColumnName (i));
        }
        
        tableAuxiliary = new JTable ();
    }



    private void btn_PrintActionPerformed (java.awt.event.ActionEvent evt) {

        fillModel_filtered ();

        try {
            Map params = new HashMap ();
            params.put ("nameCustomer", "**");

            JRDataSource dataSource = new JRTableModelDataSource (tableAuxiliary.getModel ());
            JasperPrint print = JasperFillManager.fillReport (reportPath, params, dataSource);
            JasperViewer.viewReport (print, false); // true == Exit on Close
        } catch (JRException ex) {
            ex.printStackTrace ();
        }

     }

    // Put resulting rows in the model after applying filters in jTable1
    public void fillModel_filtered () {
        dataModel_tableFiltered.setRowCount (0); // Empty rows of the model

        for (int i = 0; i <jTable1.getRowCount (); i ++) {
            Object row [] = new Object [jTable1.getColumnCount ()];
            for (int j = 0; j <jTable1.getColumnCount (); j ++) {
                row [j] = jTable1.getValueAt (i, j);
            }
            dataModel_tableFiltered.addRow (row);
        }
        tableAuxiliary.setModel(dataModel_tableFiltered); // Very Important
    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...