JTable 的行过滤器
RowFilter for JTable
我正在尝试为我的 JTable 实现一个 RowFilter,但问题是我的 Table 从数据库中获取数据,而我的 table 使用一个 JTextArea 自定义渲染器专栏,我已经实现了 RowFilter,它确实有效。
问题是,当我搜索数据时,table 默认返回正常视图,就像您在没有渲染器的情况下看到的那样,我希望搜索完成后 table 应该保留它的美学。请帮忙。
这是我的代码:
这是我的渲染器:
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,但无济于事。任何建议将不胜感激。
Tab.setModel(DbUtils.resultSetToTableModel(rs5));
首先变量名不能以大写字符开头。有些名字是正确的,有些则不正确。保持一致并遵循 Java 约定!
每当您在 JTable 上重置模型时,自定义渲染器和编辑器都会被重置。
因此您需要在设置模型后将自定义渲染器添加到 table。
我正在尝试为我的 JTable 实现一个 RowFilter,但问题是我的 Table 从数据库中获取数据,而我的 table 使用一个 JTextArea 自定义渲染器专栏,我已经实现了 RowFilter,它确实有效。
问题是,当我搜索数据时,table 默认返回正常视图,就像您在没有渲染器的情况下看到的那样,我希望搜索完成后 table 应该保留它的美学。请帮忙。 这是我的代码:
这是我的渲染器:
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,但无济于事。任何建议将不胜感激。
Tab.setModel(DbUtils.resultSetToTableModel(rs5));
首先变量名不能以大写字符开头。有些名字是正确的,有些则不正确。保持一致并遵循 Java 约定!
每当您在 JTable 上重置模型时,自定义渲染器和编辑器都会被重置。
因此您需要在设置模型后将自定义渲染器添加到 table。