gpt4 book ai didi

java - 阻止 JTree 选择更改发生的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:08 26 4
gpt4 key购买 nike

I have a dialog where each entry in a JTree has its corresponding options in a different panel, which is updated when the selection changes.如果其中一个条目的选项设置为无效状态,当用户尝试更改为树中的不同条目时,我希望出现一个错误对话框并且选择不更改。

我尝试使用 JTree 上的 valueChangeListener 来执行此操作,但目前如果出现错误,则必须让 valueChanged 方法调用“setSelectionRow”以获取旧选择。为了不出现 StackOverflow,我在执行此操作之前将 boolean 值“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());
}

关于java - 阻止 JTree 选择更改发生的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com