Share the post "Create Pushable Button Table Headers In JTable"
Swing components in Java are very flexible. You can change the table header of a JTable to become a JButton to display the headers as clickable. The class PushtableTableHeader does just that. See the code below.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public class PushableTableHeader extends JPanel { public PushableTableHeader(TableColumn column, JTableHeader header) { setLayout(new BorderLayout()); ButtonHeaderRenderer renderer = new ButtonHeaderRenderer(); column.setHeaderRenderer(renderer); header.addMouseListener(new HeaderListener(header, renderer)); } public class HeaderListener extends MouseAdapter { JTableHeader header; ButtonHeaderRenderer renderer; HeaderListener(JTableHeader header, ButtonHeaderRenderer renderer) { this.header = header; this.renderer = renderer; } @Override public void mousePressed(MouseEvent e) { int col = header.columnAtPoint(e.getPoint()); renderer.setPressedColumn(col); header.repaint(); } @Override public void mouseReleased(MouseEvent e) { int col = header.columnAtPoint(e.getPoint()); renderer.setPressedColumn(-1); header.repaint(); } } class ButtonHeaderRenderer extends JButton implements TableCellRenderer { int pushedColumn; public ButtonHeaderRenderer() { pushedColumn = -1; setMargin(new Insets(0,0,0,0)); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText((value ==null) ? "" : value.toString()); boolean isPressed = (column == pushedColumn); getModel().setPressed(isPressed); getModel().setArmed(isPressed); return this; } public void setPressedColumn(int col) { pushedColumn = col; } } } |
To use the class, you can do it like this.
|
1 |
new PushableTableHeader(jTable1.getColumn("MY_COLUMN_NAME"), jTable1.getTableHeader()); |
I purposely placed this in a class so that I could isolate only table columns that need to have a pushable button as its header.