RowFilter для JTable - PullRequest
       21

RowFilter для JTable

0 голосов
/ 10 мая 2018

Я пытаюсь реализовать RowFilter для моего JTable, но проблема в том, что моя Таблица извлекает данные из базы данных, и моя таблица использует пользовательский рендерер JTextArea для одного столбца, я реализовал RowFilter, и он работает.

Проблема в том, что при поиске данных таблица по умолчанию возвращается к обычному виду, как, например, если бы вы видели ее без средства визуализации, я хочу, чтобы после завершения поиска таблица сохраняла свою эстетику.Пожалуйста помоги.вот мой код:

это мой рендер:

class wrap extends JTextArea implements TableCellRenderer {
        wrap() {
            super();
            setLineWrap(true);
            setEditable(false);
            setWrapStyleWord(true);
            setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        }

        @Override
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean bln, boolean bln1, int i, int i1) {
            setText((String) value);
            setForeground(Tab.getForeground());
            setBackground(Tab.getBackground());
            setFont(Tab.getFont());
            return this;
        }

Вот как я накрываю свою таблицу:

public void ViewReports() {
        load l5 = new load();
        l5.setVisible(true);
        l5.j1.setText("Fetching Report.");
        SwingWorker worker1 = new SwingWorker() {
            @Override
            protected Void doInBackground() throws Exception {

                if (con == null) {
                    try {
           Class.forName("com.mysql.jdbc.Driver");
           con = DriverManager.getConnection("Connection Details go here");

                    } catch (Exception ex) {
                 JOptionPane.showMessageDialog(tcom, "Connection error.");
                    }
                }
       try {
 PreparedStatement ps = con.prepareStatement("select S_id as 'ID',c_name as 'Candidate Name',C_num as 'Number',Comments,call_status as 'Call Status', date_format(date1,'%d-%b-%y') as 'Date' from CallRecords order by S_id desc;");
                     rs5 = ps.executeQuery();
                } catch (Exception e) {
                }
                return null;
            }

            @Override
            protected void done() {
             Tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             Tab.setModel(DbUtils.resultSetToTableModel(rs5));
             Tab.getColumnModel().getColumn(3).setCellRenderer(new wrap());
                    updateRowHeights(3, 300);

                    TableColumn c1 = Tab.getColumnModel().getColumn(0);
                    TableColumn c2 = Tab.getColumnModel().getColumn(1);
                    TableColumn c3 = Tab.getColumnModel().getColumn(2);
                    TableColumn c4 = Tab.getColumnModel().getColumn(3);
                    TableColumn c5 = Tab.getColumnModel().getColumn(4);
                    TableColumn c6 = Tab.getColumnModel().getColumn(5);

                    c1.setPreferredWidth(50);
                    c2.setPreferredWidth(130);
                    c3.setPreferredWidth(120);
                    c4.setPreferredWidth(350);
                    c5.setPreferredWidth(100);
                    c6.setPreferredWidth(100);
                try {
                    rs5.close();
                } catch (SQLException ex) {}
                l5.dispose();
            }
        };
        worker1.execute();
}

и вот мой метод фильтрации:

 private void filter(String filterText){
            TableModel dm =(TableModel) Tab.getModel();
            TableRowSorter<TableModel> tr=new TableRowSorter<>(dm);
            Tab.setRowSorter(tr);
            tr.setRowFilter(RowFilter.regexFilter(filterText));
        }

 private void RecordFilterKeyReleased(java.awt.event.KeyEvent evt) {                                         
         String Text = RecordFilter.getText();
         filter(Text);
    }  

Я также использовал DefaultTableModel вместо TableModel, но безрезультатно.Любое предложение будет высоко оценено.

1 Ответ

0 голосов
/ 10 мая 2018
Tab.setModel(DbUtils.resultSetToTableModel(rs5));

Прежде всего имена переменных НЕ должны начинаться с символа верхнего регистра.Некоторые из ваших имен верны, другие нет.Будьте последовательны и следуйте соглашениям Java!

Каждый раз, когда вы сбрасываете модель на JTable, пользовательские средства визуализации и редакторы сбрасываются.

Так что вам нужно добавить пользовательский рендер в таблицу ПОСЛЕ установки модели.

...