在按下TAB后,如何在JTable中移回已编辑的单元格?

时间:2012-02-21 16:18:53

标签: java swing jtable

场景是这样的:用户编辑一个单元格,然后按TAB键。编辑停止,值在模型中。但是,如果postUpdateTestFailed()返回true,我想将选择移回刚刚编辑的单元格,以便用户可以进行一些修改。问题是,它不起作用。它适用于除我选择的单元格之外的其他任何东西... :(因为用户按下TAB,焦点/选定的单元格总是下一个。看起来像我的选择更改在这种特殊情况下被忽略。我做错了什么? :)

public void tableChanged(TableModelEvent tme) {
    int row = tme.getFirstRow();
    int col = tme.getColumn();
    int type = tme.getType();
    switch (type) {
        case TableModelEvent.UPDATE:
            currentRow = areenTable.convertRowIndexToView(row);
            currentColumn = areenTable.convertColumnIndexToView(col);
            if (postUpdateTestFailed()) {
                // if the test fails, I want to move back to the edited cell
                areenTable.changeSelection(currentRow, currentColumn, false, false);
            }
            break;

        // the rest of switch

    } // switch
} // tableChanged() method

编辑1 :我希望之前有人遇到过同样的问题并以某种方式解决了......

编辑2 :我通常会在自己的单元格编辑器实现中执行此操作,并在验证失败时阻止提交。不幸的是,在这种特殊情况下,我必须在提交更改后调用postUpdateTestFailed() ...然后将光标定位到先前编辑的单元格。奇怪的是我可以移动到任何其他单元格,但最后编辑的那个!我认为这是一个错误。

2 个答案:

答案 0 :(得分:2)

显示的方法在提交编辑后检查数据,这需要导航回最近编辑的单元格。相反,请在结束之前验证自定义TableCellEditor 中输入的值,如此example所示。

答案 1 :(得分:2)

无法抗拒尝试它(听起来太奇怪了 - 是的,即使我必须尝试一下,发生了什么,所以下次......; - )

问题是您的监听器在表之前被通知,即内部更新尚未准备好。要工作,请确保在表的内部之后处理它,通过包装到invokeLater,类似

    @Override
    public void tableChanged(TableModelEvent tme) {
        int row = tme.getFirstRow();
        int col = tme.getColumn();
        int type = tme.getType();
        switch (type) {
            case TableModelEvent.UPDATE:
                final int currentRow = table.convertRowIndexToView(row);
                final int currentColumn = table.convertColumnIndexToView(col);
                if (currentRow == 0) {
                    // if the test fails, I want to move back to the edited cell
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            table.changeSelection(currentRow, currentColumn, false, false);

                        }
                    });
                }
                break;

            // the rest of switch

        } // switch
    } // tableChanged() method
顺便说一句,我不会在TableModel上监听更改(它们可能以编程方式或其他原因发生,例如基础数据模型中的更改),而是监听表格编辑器或编辑路径/列属性的更改