提问者:小点点

JTable, TableColumnModelListener检测选定的行


我想完成的是:如果用户在我的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
    }    
}

共2个答案

匿名用户

出现这个问题是因为行和列选择是由两个不相关的模型处理的:一个触发器在两个模型中都改变了选择(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没有正确返回选定的行