【问题标题】:Intercept jTable selection change events拦截 jTable 选择更改事件
【发布时间】:2010-06-18 04:14:40
【问题描述】:

我发现 this forum thread 建议覆盖 ListSelectionModel 以防止行被选中。

当当前所选项目存在未保存的更改(表外部)时,我想防止选择更改,直到用户确认丢弃。比如:

public class confirmSelectionChange extends DefaultListSelectionModel {
    public void setSelectionInterval(int index0, int index1) {
        if (unsavedChanges()) {
            super.setSelectionInterval(int index0, int index1);
        }
    }

    private boolean unsavedChanges() {
        if (noUnsavedChangesExist) {
            return true;
        }

        // Present modal dialog: save, discard cancel
        if (dialogAnswer == SAVE) {
            // save changes
            return true;
        } else if (dialogAnswer == DISCARD) {
            return true;
        } else {
            return false;
        }
    }
}

是否可以在 ListSelectionModel 更改中间插入阻塞代码?有没有更好的方法来拦截选择更改事件?

我已经在听他们的了,但到那时变化已经发生了。

【问题讨论】:

    标签: java user-interface swing jtable selection


    【解决方案1】:

    我的最终解决方案(部分感谢this code guru)是创建一个匿名内部类,该类扩展JTable 并覆盖changeSelection()。尝试了一个单独的类,因为我读到有些人认为匿名内部类不是好的 OO 设计,但我需要了解编辑状态,而且我必须调用保存/丢弃方法。当它是你自己的代码时,谁需要封装? ;-)

    jTableMemberList = new JTable() {
        public void changeSelection(int rowIndex, int columnIndex, boolean toggle,
                                    boolean extend) {
            // Member is being edited and they've clicked on a DIFFERENT row (this
            // method gets called even when the selection isn't actually changing)
            if (editModeIsActive && getSelectedRow() != rowIndex) {
                // User was editing, now they're trying to move away without saving
                Object[] options = {"Save", "Discard", "Cancel"};
                int n = JOptionPane.showOptionDialog(this,
                                                "There are unsaved changes for the "
                                                + "currently selected member.\n\n"
                                                + "Would you like to save them?",
                                                "Save changes?",
                                                JOptionPane.YES_NO_CANCEL_OPTION,
                                                JOptionPane.WARNING_MESSAGE,
                                                null,
                                                options,
                                                options[0]);
    
                if (n == JOptionPane.YES_OPTION) {
                    saveChanges();
                } else if (n == JOptionPane.NO_OPTION) {
                    discardChanges();
                } else {
                    // Exit without passing call on to super
                    return;
                }
            }
    
            // make the selection change
            super.changeSelection(rowIndex, columnIndex, toggle, extend);
        }
    };
    

    到目前为止,此解决方案似乎有效,但我尚未对其进行广泛测试。这段代码的某个阴暗角落可能潜伏着错误或陷阱……

    希望对其他人有所帮助!

    【讨论】:

    • 对不起,如果询问、回答和评论的形式不好,但我只是想在我的实际程序中补充一点,我将上面的对话框代码移到了它自己的方法中,因为在其他情况下我需要相同的方法保存/丢弃/取消功能(例如退出时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2021-06-27
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多