我创建了一个实现 ITreeContentProvider
的自定义内容提供程序,我的自定义模型与此类似:Vogella Tutorial JFace其中有类别和待办事项,待办事项作为类别的子项存储为类类别中的列表。
我正在使用 Eclipse 对话框 CheckedTreeSelectionDialog
,它应该与任何树对话框相同,我将其扩展为能够获取 map 中选中的元素,但由于某种原因我可以获得 level1 的树项,但是不是他们的 child ,我不明白为什么。
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()
返回一个空树项,但选择对话框正确显示父项和子项。
最佳答案
阅读TreeItem#getItems() API Javadoc 我发现了这个:
Returns a (possibly empty) array of TreeItems which are the direct item children of the receiver. Note: This is not the actual structure used by the receiver to maintain its list of items, so modifying the array will not affect the receiver.
我对 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);
}
关于java - TreeViewer 对话框 java eclipse 不提供树项目子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607403/