2

我创建了一个自定义内容提供程序,它实现ITreeContentProvider了我的自定义模型,类似于:Vogella Tutorial JFace,它有类别和待办事项,待办事项作为类别的子项存储为类别中的列表。我正在使用 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()返回一个空树项,但选择对话框正确显示了父母和孩子。

4

1 回答 1

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);
 }
于 2012-12-17T13:55:04.327 回答