我在您的编辑中解决了您的问题:
package jtableheadermouseevent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
*
* @author martijn
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame fr = new JFrame("JTable Header Mouse Listener");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable();
JScrollPane pane = new JScrollPane(table);
String[][] data = {{"Foo", "Bar"}, {"Baz", "Coffee"}};
String[] columns = {"Header 0", "Header 1"};
DefaultTableModel model = new DefaultTableModel(data, columns);
table.setModel(model);
fr.add(pane);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
System.out.println("Header clicked : (X: " + e.getX() + ", Y: " + e.getY() + ") With button " + e.getButton() );
int header = table.getTableHeader().columnAtPoint(e.getPoint());
System.out.println("This means header " + header + " is clicked!");
}
});
fr.pack();
fr.setSize(800, 300);
fr.setVisible(true);
}
}
这在 Linux 中非常有效,所以我想在 OSX 和 Windows 上也是如此。我也在调整列大小后对其进行了测试:它仍然知道按下了哪些列。但是在对列重新排序后,第一个“第 0 列”的列变成了“第 1 列”。
但是您始终可以禁止用户使用以下方法移动列:
table.getTableHeader().setReorderingAllowed(false);
希望这可以帮助