当前位置:  开发笔记 > 编程语言 > 正文

阻止JTree选择发生变化的最佳方法是什么?

如何解决《阻止JTree选择发生变化的最佳方法是什么?》经验,为你挑选了1个好方法。

我有一个对话框,其中JTree中的每个条目在不同的面板中都有相应的选项,当选择更改时会更新.如果其中一个条目的选项设置为无效状态,当用户尝试更改为树中的其他条目时,我希望有一个错误对话框并且选择不会更改.

我尝试在JTree上使用valueChangeListener执行此操作,但是如果出现错误,则当前必须将valueChanged方法调用"setSelectionRow"到旧选择.所以我没有获得StackOverflow,我在执行此操作之前将布尔"isError"设置为true,以便我可以忽略新的valueChanged事件.不知怎的,我有直觉,这不是最好的解决方案.;-)

我该怎么做呢?对于这样的情况,有一个好的设计模式吗?



1> 小智..:

我没有找到更好的方法,但这种方法对我来说很好.我知道在Delphi中这是一个非常方便的事件:"在更改选择之前",你可以很容易地停止改变选择.

这是我的java代码,防止无限递归问题

    navTree.addTreeSelectionListener(new TreeSelectionListener() {

        boolean treeSelectionListenerEnabled = true;

        public void valueChanged(TreeSelectionEvent e) {
            if (treeSelectionListenerEnabled) {
                if (ok to change selection...) {
                    ...
                } else {
                    TreePath treePath = e.getOldLeadSelectionPath();
                    treeSelectionListenerEnabled = false;
                    try {
                        // prevent from leaving the last visited node
                        navTree.setSelectionPath(treePath);
                    } finally {
                        treeSelectionListenerEnabled = true;
                    }
                }
            }
        }
    });

永远记得删除你添加的所有监听器,以防止内存泄漏.

这是另一种方法:

private class VetoableTreeSelectionModel extends DefaultTreeSelectionModel {
    public void setSelectionPath(TreePath path){
        if (allow selection change?) {
            super.setSelectionPath(path);
        }
    }
}
{
    navTree.setSelectionModel(new VetoableTreeSelectionModel());
}

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有