我有一个对话框,其中JTree中的每个条目在不同的面板中都有相应的选项,当选择更改时会更新.如果其中一个条目的选项设置为无效状态,当用户尝试更改为树中的其他条目时,我希望有一个错误对话框并且选择不会更改.
我尝试在JTree上使用valueChangeListener执行此操作,但是如果出现错误,则当前必须将valueChanged方法调用"setSelectionRow"到旧选择.所以我没有获得StackOverflow,我在执行此操作之前将布尔"isError"设置为true,以便我可以忽略新的valueChanged事件.不知怎的,我有直觉,这不是最好的解决方案.;-)
我该怎么做呢?对于这样的情况,有一个好的设计模式吗?
我没有找到更好的方法,但这种方法对我来说很好.我知道在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()); }