Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

JTable with sorting and filtering per column

843806Nov 2 2008 — edited Nov 2 2008
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;
	}
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 30 2008
Added on Nov 2 2008
1 comment
725 views