我想要完成的是以下内容: 如果用户将我的JTable中的第5列聚焦(通过单击它或按Tab键直到他到达第5个单元格),我会显示一个对话框。然后,对话框的结果将放入该单元格中。要访问该单元格,我需要知道所关注的行和列。
我现在面临的问题是,如果我点击单元格,在聚焦表中的任何其他内容之前,getSelectedRow()返回-1,而getSelectedColumn()返回右列。
问题:如何确定表格中第一次点击的选定行。或者是我唯一的选择,可以分别处理第一次点击。
new TableColumnModelListener() {
.
.
.
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
System.out.println(getSelectedColumn()); // this is correct
System.out.println(getSelectedRow()); // -1 on first click in JTable
}
}
答案 0 :(得分:3)
问题出现是因为行和列选择由两个不相关的模型处理:一个触发器改变两者中的选择(通过鼠标按下)将通过首先更改一个,然后另一个(不保证序列)来实现。因此,在收到更改通知时,您无法知道另一个是否已经更改。
要解决此问题,请将您对通知的自定义处理包装到invokeLater中:在处理完所有待处理事件后,确保发生
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println(table.getSelectedColumn()); // this is correct
System.out.println(table.getSelectedRow()); // -1 on first click in JTable
}
});
}
答案 1 :(得分:0)
试试这个:
table.addMouseListener(new MouseListener()
{
@Override
public void mousePressed(MouseEvent evt)
{
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
System.out.println(row);
System.out.println(col);
if (col==4){
JOptionPane.showInputDialog(null, "hi");
}
}
每次用户点击时都会显示所选的行和列。唯一的缺点是第一行会打印出0,因此你必须设置(col == 4)来触发对话框。这不是一个tablecolumnmodellistener。
或者,你可能想看看这个,因为有人似乎有类似的问题:JTable not returning selected row correctly