gpt4 book ai didi

java - 如何正确使用 CheckboxTreeViewer?

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:21 24 4
gpt4 key购买 nike

我面临的问题是,已实现的 CheckboxTreeViewer 在 Linux Debian 上完美运行,但在 Windows 下却不行。首先,我不理解“setGrayed()”的概念。是否表明只有元素中的部分子元素被选中?

所以问题是:当我在 Windows 下检查一个项目时,它会检查树中的所有其他元素。不知何故,整个逻辑都被忽略了。

这是我来自 ICheckStateListener 的代码:

@Override
public void checkStateChanged(final CheckStateChangedEvent event) {
// object checked
final TreePath path = ((ITreeSelection) this.treeViewer.getSelection()).getPaths()[0];
checkChildren(path, event.getChecked());
checkParents(path.getParentPath());
syncData();
}

public void checkParents(final TreePath path) {
if (path == null) {
return;
}
final IFieldElement<Object> treeElement = (IFieldElement<Object>) path.getLastSegment();
if (treeElement != null) {
boolean allChecked = true;
boolean allUnchecked = true;
for (final Object fieldElement : treeElement.getChildrenElements()) {
allChecked = allChecked && this.treeViewer.getChecked(fieldElement);
allUnchecked = allUnchecked && !this.treeViewer.getChecked(fieldElement);
}
if (allUnchecked) {
this.treeViewer.setChecked(treeElement, false);
this.treeViewer.setGrayed(treeElement, false);
} else
if (allChecked) {
this.treeViewer.setChecked(treeElement, true);
this.treeViewer.setGrayed(treeElement, false);
} else
if (!allUnchecked && !allChecked) {
this.treeViewer.setChecked(treeElement, true);
this.treeViewer.setGrayed(treeElement, true);
}
}
checkParents(path.getParentPath());
}

public void checkChildren(final TreePath path, final boolean checked) {
if (path == null) {
return;
}
final Object element = path.getLastSegment();
if (element != null) {
this.treeViewer.setChecked(element, checked);
this.treeViewer.setGrayed(element, false);
this.treeViewer.setSubtreeChecked(element, checked);
if (element instanceof EventMethod) {
checkEventMethod(path, element, checked);
}

}
}

编辑:我正在使用 Eclipse Indigo

提前致谢!

最佳答案

树中复选框的“灰色”状态只是选中和未选中之外的另一种状态。如何使用它取决于你,但通常它意味着“部分检查”状态。在通常的实践中,如果一个项目有一些 child 被选中而其他 child 未被选中,父项将显示选中+灰色状态。具体如何呈现取决于操作系统及其版本。在某些实现中,用户只能选中或取消选中树项目,而不能通过鼠标点击明确设置项目的灰色状态。它会根据选中的子项自动发生。然而,有时有些应用程序还允许您单击复选框以将其选中变为灰色变为未选中。在这种情况下,灰色状态通常意味着“默认”状态。无论如何,这取决于实现。

我不确定您面临的问题是什么,但如果我不得不猜测,我会说在抛出事件时,小部件在 Debian 和 Windows 中的行为不同。由于在您的实现中,无论何时检查一个项目,您都会检查其所有父项及其所有子项,因此可能是在 Windows 中对父项调用被称为检查所有 parent 的所有 child ,因此一切都被启用。测试一下,看看这是否是问题所在。为避免这种情况,请在修改任何内容之前首次收到事件时创建一个标志。并且在修改时忽略所有 checkStateChanged() 事件调用,只要设置了该标志,这样您对元素的更改就不会递归地应用于整个树。完成一项选中/未选中操作后,操作会重置标志,以便再次处理用户事件。

private boolean ignoreCheckEvent = false;

@Override
public void checkStateChanged(final CheckStateChangedEvent event) {
if (ignoreCheckEvent)
return;

ignoreCheckEvent = true;

try {
// object checked
final TreePath path = ((ITreeSelection) this.treeViewer.getSelection()).getPaths()[0];
checkChildren(path, event.getChecked());
checkParents(path.getParentPath());
syncData();
}
finally {
ignoreCheckEvent = false;
}
}

关于java - 如何正确使用 CheckboxTreeViewer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14384095/

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