Epa*_*aga 3 java error-handling swing design-patterns
我有一个对话框,其中JTree中的每个条目在不同的面板中都有相应的选项,当选择更改时会更新.如果其中一个条目的选项设置为无效状态,当用户尝试更改为树中的其他条目时,我希望有一个错误对话框并且选择不会更改.
我尝试在JTree上使用valueChangeListener执行此操作,但是如果出现错误,则当前必须将valueChanged方法调用"setSelectionRow"到旧选择.所以我没有获得StackOverflow,我在执行此操作之前将布尔"isError"设置为true,以便我可以忽略新的valueChanged事件.不知怎的,我有直觉,这不是最好的解决方案.;-)
我该怎么做呢?对于这样的情况,有一个好的设计模式吗?
小智 7
我没有找到更好的方法,但这种方法对我来说很好.我知道在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;
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
永远记得删除你添加的所有监听器,以防止内存泄漏.
这是另一种方法:
private class VetoableTreeSelectionModel extends DefaultTreeSelectionModel {
public void setSelectionPath(TreePath path){
if (allow selection change?) {
super.setSelectionPath(path);
}
}
}
{
navTree.setSelectionModel(new VetoableTreeSelectionModel());
}
Run Code Online (Sandbox Code Playgroud)