1

我想要完成的是:如果用户将焦点放在我的 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
    }    
}
4

2 回答 2

3

出现问题是因为行和列选择由两个不相关的模型处理:更改两者中的选择的触发器(fi a mousePressed)将首先更改一个,然后更改另一个(不保证顺序)。因此,在收到一个更改通知时,您无法知道另一个是否已经更改。

要解决此问题,请将您对通知的自定义处理包装到一个 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
        }
    });
}
于 2013-06-23T09:38:52.063 回答
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 return selected row correct

于 2013-06-23T08:08:09.133 回答