2

実装するカスタム コンテンツ プロバイダーITreeContentProviderと、次のようなカスタム モデルを作成しました: Vogella Tutorial JFaceには、カテゴリと Todos があり、Todos はカテゴリの子としてクラス Category のリストとして格納されます。私は日食ダイアログCheckedTreeSelectionDialogを使用していますが、それは他のツリーダイアログと同じである必要があり、マップでチェックされた要素を取得できるように拡張しましたが、何らかの理由でレベル1のツリーアイテムを取得できますが、その子は取得できず、理由がわかりません.

    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 に答える