Я пытаюсь реализовать 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, но безрезультатно.Любое предложение будет высоко оценено.