RowFilter for JTable
我正在尝试为JTable实现RowFilter,但是问题是我的Table从数据库中获取数据,并且我的表对一列使用了JTextArea自定义渲染器,我已经实现了RowFilter并且可以正常工作。
问题在于,当我搜索数据时,表默认返回正常视图,就像没有渲染器时所看到的那样,我希望在完成搜索后,表应保留其美观。请帮忙。
这是我的代码:
这是我的渲染器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
这是我设置餐桌的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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(); } |
这是我的过滤方法:
1 2 3 4 5 6 7 8 9 10 11 | 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 | Tab.setModel(DbUtils.resultSetToTableModel(rs5)); |
首先,变量名不应以大写字母开头。您的一些名字正确,而其他的则不正确。保持一致并遵循Java约定!
每当您在JTable上重置模型时,都会自定义渲染器和编辑器。
因此,您需要在设置模型后将自定义渲染器添加到表中。