Improving TableRowSorter Filter Performance
Hi, I currently have a TableModel with over 17300 rows of data, which has a TableRowSorter attached to provide sorting and filtering on the JTable. Everything works fine except that filtering the table takes to long, even on a Wndow Vista machine with an Intel Core 2 Duo (3.6ghz processor)
Is there any known way to improve the filtering performance on TableRowSorter? It should be noted however, that Sorting with the same data does not take as long (at times). It is also much slower when all the necessary bells and whistles or rendering are included.
Here is an example piece of code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
publicclass Trialextends JFrame{
public JTable table;
public DefaultTableModel model;
public TableRowSorter sorter;
public JTextField filterField;
public Trial(){
super("Filter Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Vector<String> cols =new Vector<String>();
cols.addElement("Column 1");
cols.addElement("Column 2");
cols.addElement("Column 3");
cols.addElement("Column 4");
cols.addElement("Column 5");
cols.addElement("Column 6");
Vector<Vector><Object>> rows =new Vector<Vector><Object>>();
for(int i = 0; i < 20000; i++){
Vector<Object> row =new Vector<Object>();
row.addElement("Column 1 Data " + (i+1) );
row.addElement("Some Data " + (i+1) );
row.addElement("Column 3 Data " + (i+1) );
row.addElement("Even More Data " + (i+1) );
row.addElement("Column 5 Data " + (i+1) );
row.addElement("Please No More Data " + (i+1) );
rows.addElement( row );
}
model =new DefaultTableModel(rows, cols);
table =new JTable( model );
table.setRowSorter(new TableRowSorter(model) );
JScrollPane scr =new JScrollPane(table);
filterField =new JTextField(20);
filterField.addCaretListener(new CaretListener(){
publicvoid caretUpdate(CaretEvent e){
if(table.getRowSorter() ==null)return;
setCursor( Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR) );
String text = filterField.getText();
((DefaultRowSorter)table.getRowSorter()).setRowFilter(RowFilter.regexFilter(".*" + text +".*"));
setCursor( Cursor.getDefaultCursor() );
}
});
JPanel filterPanel =new JPanel(new FlowLayout(FlowLayout.LEFT) );
filterPanel.add(new JLabel("Filter: ") );
filterPanel.add( filterField );
getContentPane().add( filterPanel, BorderLayout.NORTH );
getContentPane().add( scr, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
try{
setExtendedState(MAXIMIZED_BOTH);
}catch(Exception e){}
setVisible(true);
}
publicstaticvoid main(String[] args){
new Trial();
}
}
Any ideas as to how performance (or percieved performance) can be improved would gladly be apprieciated.
ICE

