There would be a case in which we want to do something when the user clicks on a column header of a JTable. To do so, follow these simple steps:
public class TableHeaderMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent event) { // do something when mouse clicked... } }
JTableHeader header = table.getTableHeader();
header.addMouseListener(new TableHeaderMouseListener(table));
To know which column header is clicked, we call the JTable’s method columnAtPoint(Point) inside the mouseClicked() method as follows:
Point point = event.getPoint(); int column = table.columnAtPoint(point);
The return value is index number of the column being clicked. So here’s a complete example code of the TableHeaderMouseListener class:
package net.codejava.swing.jtable; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JOptionPane; import javax.swing.JTable; /** * A mouse listener class which is used to handle mouse clicking event * on column headers of a JTable. * @author www.codejava.net * */ public class TableHeaderMouseListener extends MouseAdapter { private JTable table; public TableHeaderMouseListener(JTable table) { this.table = table; } public void mouseClicked(MouseEvent event) { Point point = event.getPoint(); int column = table.columnAtPoint(point); JOptionPane.showMessageDialog(table, "Column header #" + column + " is clicked"); // do your real thing here... } }
And following is code of a Swing-based demo program that creates a simple JTable component which uses the TableHeaderMouseListener class above as its header’s mouse listener:
package net.codejava.swing.jtable; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.JTableHeader; /** * A Swing program demonstrates how to handle mouse clicking event * on column headers of a JTable component. * @author www.codejava.net * */ public class JTableHeaderMouseClickDemo extends JFrame { private JTable table; public JTableHeaderMouseClickDemo() { super("JTable Column Header Mouse Click Demo"); // constructs the table String[] columnNames = new String[] {"Title", "Author", "Published Date"}; String[][] rowData = new String[][] { {"Spring in Action", "Craig Walls", "June 29th 2011"}, {"Struts 2 in Action", "Donald Brown", "May 1st 2008"}, {"Hibernate Made Easy", "Cameron Wallace McKenzie", "April 25th 2008"}, }; table = new JTable(rowData, columnNames); table.setAutoCreateRowSorter(true); JTableHeader header = table.getTableHeader(); header.addMouseListener(new TableHeaderMouseListener(table)); add(new JScrollPane(table)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(640, 150); setLocationRelativeTo(null); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new JTableHeaderMouseClickDemo().setVisible(true); } }); } }
Output when running the above program:
When clicking on a column header, a message dialog appears saying which column is clicked: