我正试图为我的jtable实现一个rowfilter,但问题是我的表从数据库获取数据,而我的表对一列使用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;
}
我就是这样摆table的:
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条答案
按热度按时间bybem2ql1#
首先,变量名不应以大写字符开头。你的名字有些是对的,有些不是。保持一致并遵循java约定!
每当您在jtable上重置模型时,都会重置自定义渲染器和编辑器。
因此,需要在设置模型后将自定义呈现器添加到表中。