Dear readers,
I would like to have a filter/search field for each column of a JTable.
I'm aware of the FilterTable JTable example, however, that example only has a single field, which filters all columns.
Below, I modified the RegexTable example, as a minimal example to illustrate my problem.
The problem is that the textfield never gets focus, it's impossible to enter a value in it.
(Besides that the sorting arrow up/down is not anymore working, but this is a minor problem.)
Thanks for any suggestions,
Jonne.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableWithFilter {
public static void main(String args[]) {
JFrame frame = new JFrame("Regexing JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rows[][] = {
{ "A", "About", 44.36 }, { "B", "Boy", 44.84 },
{ "C", "Cat", 463.63 }, { "D", "Day", 27.14 },
{ "E", "Eat", 44.57 }, { "F", "Fail", 23.15 },
{ "G", "Good", 4.40 }, { "H", "Hot", 24.96 },
{ "I", "Ivey", 5.45 }, { "J", "Jack", 49.54 },
{ "K", "Kids", 280.00 } };
String columns[] = { "Symbol", "Name", "Price" };
TableModel model = new DefaultTableModel(rows, columns);
final JTable table = new JTable(model);
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
// Enable sorting
table.setAutoCreateRowSorter(true);
// Decorate the table with a custom JTableHeader that includes
// filter fields for each column.
HeaderRendererWithFilter headerRenderer = new HeaderRendererWithFilter();
// table.getTableHeader().setDefaultRenderer(headerRenderer);
table.getColumnModel().getColumn(0).setHeaderRenderer(headerRenderer);
table.getColumnModel().getColumn(1).setHeaderRenderer(headerRenderer);
frame.setSize(400, 300);
frame.setVisible(true);
}
}
class HeaderRendererWithFilter extends JPanel implements TableCellRenderer {
HeaderRendererWithFilter() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setOpaque(false);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = new JLabel((String) value);
label.setBackground(Color.red);
JTextField textField = new JTextField("col:" + column);
textField.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {System.out.println("mc"+e);}
public void mouseEntered(MouseEvent e) {System.out.println("me"+e);}
public void mouseExited(MouseEvent e) {System.out.println("mx"+e);}
public void mousePressed(MouseEvent e) {System.out.println("mp"+e);}
public void mouseReleased(MouseEvent e) {System.out.println("mr"+e);}
});
removeAll();
add(label, Box.RIGHT_ALIGNMENT);
add(textField);
return this;
}
}