Java JTable,TableColumnModelListener检测所选行
我想做到的是: 如果用户在我的JTable中聚焦一行的第五列(通过单击它或按tab键直到他到达第五个单元格),我将显示一个对话框。然后,对话框的结果将被放入该单元格中。要访问该单元格,我需要知道聚焦的行和列 我现在面临的问题是,如果我单击单元格,在对表中其他任何内容进行对焦之前,getSelectedRow()返回-1,而getSelectedColumn()返回右列 问题:如何在表中第一次单击时确定所选行。或者是我唯一的选择做一个大的变通来处理第一次点击分开Java JTable,TableColumnModelListener检测所选行,java,swing,jtable,focus,selection,Java,Swing,Jtable,Focus,Selection,我想做到的是: 如果用户在我的JTable中聚焦一行的第五列(通过单击它或按tab键直到他到达第五个单元格),我将显示一个对话框。然后,对话框的结果将被放入该单元格中。要访问该单元格,我需要知道聚焦的行和列 我现在面临的问题是,如果我单击单元格,在对表中其他任何内容进行对焦之前,getSelectedRow()返回-1,而getSelectedColumn()返回右列 问题:如何在表中第一次单击时确定所选行。或者是我唯一的选择做一个大的变通来处理第一次点击分开 new TableColumnMo
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
}
}
试试这个:
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
或者,您可能想看看这一点,因为有人似乎也有类似的问题:问题的出现是因为行和列的选择由两个不相关的模型处理:一个触发器更改两个模型中的选择(f.i.鼠标按下)将先更改一个,然后更改另一个(不保证顺序). 因此,在收到其中一个的更改通知时,您无法知道另一个是否已经更改 要解决此问题,请将通知的自定义处理包装到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
}
});
}
几点意见:a)与低级事件(如鼠标)相比,支持语义事件(如选择)是一种很好的做法。否则,您将不得不为所有类型的低级事件复制代码,如键盘、触摸、心灵控制。。b) 这确实起作用的原因是偶然的:它依赖于mouseEvents的分派顺序(表的内部侦听器在您之前得到通知),这是未指定的,并且是一个实现细节。事实上,它甚至不能保证在表的生命周期中是相同的:更改LAF并看到它断开:-)可能的^^^谢谢,我不知道调用器的事情:-)谢谢你的回答Karki,但是kleopatras解决方案对我来说是最好的。干杯