Java JTable,TableColumnModelListener检测所选行

Java JTable,TableColumnModelListener检测所选行,java,swing,jtable,focus,selection,Java,Swing,Jtable,Focus,Selection,我想做到的是: 如果用户在我的JTable中聚焦一行的第五列(通过单击它或按tab键直到他到达第五个单元格),我将显示一个对话框。然后,对话框的结果将被放入该单元格中。要访问该单元格,我需要知道聚焦的行和列 我现在面临的问题是,如果我单击单元格,在对表中其他任何内容进行对焦之前,getSelectedRow()返回-1,而getSelectedColumn()返回右列 问题:如何在表中第一次单击时确定所选行。或者是我唯一的选择做一个大的变通来处理第一次点击分开 new TableColumnMo

我想做到的是: 如果用户在我的JTable中聚焦一行的第五列(通过单击它或按tab键直到他到达第五个单元格),我将显示一个对话框。然后,对话框的结果将被放入该单元格中。要访问该单元格,我需要知道聚焦的行和列

我现在面临的问题是,如果我单击单元格,在对表中其他任何内容进行对焦之前,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
    }    
}
试试这个:

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解决方案对我来说是最好的。干杯