我想完成的是:如果用户在我的JTable中聚焦一行的第5列(通过单击它或按tab直到他到达第5个单元格),我显示一个对话框。然后对话框的结果将被放入该单元格。要访问该单元格,我需要知道聚焦的行和列。
我现在面临的问题是,如果我单击单元格,在对焦表中的任何其他内容之前,getSelectedRow()返回-1,而getSelectedCol列()返回正确的列。
问题:如何在表中第一次单击时确定选定的行。或者是我唯一的选择,可以做一个大的解决方法来单独处理第一次单击。
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
}
}
出现这个问题是因为行和列选择是由两个不相关的模型处理的:一个触发器在两个模型中都改变了选择(f. i.一个鼠标按下),首先改变一个,然后改变另一个(没有顺序保证)。因此,在收到一个更改通知时,您无法知道另一个是否已经更改。
要解决此问题,请将您对通知的自定义处理包装到调用中稍后:这保证会在处理完所有挂起事件后发生:
@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
}
});
}
试试这个:
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,因此您必须设置(coll==4)来触发对话框。这不是一个tablecolumnModellistener虽然。
或者,您可能想看看这个,因为有人似乎有类似的问题:JTable没有正确返回选定的行