JTable,TableColumnModelListener检测选定的行

时间:2013-06-22 23:23:07

标签: java swing jtable focus selection

我想要完成的是以下内容: 如果用户将我的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
    }    
}

2 个答案:

答案 0 :(得分:3)

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

要解决此问题,请将您对通知的自定义处理包装到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
        }
    });
}

答案 1 :(得分: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 returning selected row correctly