我创建了一个自定义内容提供程序,用于实现ITreeContentProvider
和我的自定义模型:Vogella Tutorial JFace其中包含Categories和Todos,Todos作为类别的子项存储为类别列表。
我正在使用eclipse对话框CheckedTreeSelectionDialog
,它应该与任何树对话框相同,并且我将其扩展为能够在地图中获取已检查的元素但由于某种原因我可以获得level1但不是他们的子项的树项目我无法理解为什么。
public void createMapOfCheckedItems() {
mapOfCheckedElements = new HashMap<Object, List<Object>>();
for (TreeItem level1 : getTreeViewer().getTree().getItems()) {
if (level1.getChecked()) {
List<Object> checkedChildren = new ArrayList<Object>();
for (TreeItem level2 : level1.getItems()) {
if (level2.getChecked()) {
checkedChildren.add(level2.getData());
}
}
mapOfCheckedElements.put(level1.getData(), checkedChildren);
}
}
}
代码如上,但level1.getItems()
返回一个空的树项目,但选择对话框正确显示了父母和孩子。
答案 0 :(得分:2)
阅读TreeItem#getItems() API Javadoc我发现了这个:
返回一个(可能为空)TreeItems数组,它是接收者的直接子项。 注意:这不是接收器用来维护其项目列表的实际结构,因此修改数组不会影响接收器。
我对SWT API的了解不是太广泛,但我的猜测是使用TreeViewer#getItems(org.eclipse.swt.widgets.Item)方法可以解决问题,因为查看器可以保留所有节点的状态。
因此,您的代码应该类似于:
if (level1.getChecked()) {
List<Object> checkedChildren = new ArrayList<Object>();
for (Item level2 : getTreeViewer().getItems(level1)) {
if (((TreeItem)level2).getChecked()) {
checkedChildren.add(level2.getData());
}
}
mapOfCheckedElements.put(level1.getData(), checkedChildren);
}