この単純な機能のためのドキュメントが不足しているのは混乱しています。私はTreeViewer
を持っていて、ノードを選択したい。これが意味する唯一の方法は、ツリーがすべての要素を選択肢に展開し、そうでなければユーザーがそれを見ることができない場合です。TreeViewerでノードを選択
public class TreeWindow extends ApplicationWindow {
public static void main(String[] args) {
new TreeWindow().open();
}
public TreeWindow() {
super(null);
setBlockOnOpen(true);
}
@Override
protected Control createContents(Composite parent) {
final TreeViewer treeViewer = new TreeViewer(parent);
treeViewer.setContentProvider(new FileTreeContentProvider());
treeViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
String result = ((File) element).getName();
if (result.isEmpty()) {
result = ((File) element).getPath(); // root like C:\
}
return result;
}
});
treeViewer.setInput(File.listRoots());
// expand
final File fileToExpand = new File("src");
System.out.println("Expand to file: " + fileToExpand.getAbsolutePath());
return treeViewer.getControl();
}
static class FileTreeContentProvider extends ArrayContentProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
return ((File) parentElement).listFiles();
}
@Override
public Object getParent(Object element) {
return ((File) element).getParentFile();
}
@Override
public boolean hasChildren(Object element) {
return ((File) element).isDirectory();
}
}
}
:
treeViewer.setSelection(new StructuredSelection(fileToExpand));
System.out.println("Selection: " + treeViewer.getSelection());
選択が設定されません。 (私は複数回、TreeViewer#setSelection(ISelection, boolean)
が使用されているのを見ましたが、JavaDocは "現在表示されていないアイテムを選択するだけのAPIをツリーに提供しないため、公開パラメータは受け付けられません"と述べています)。
treeViewer.expandToLevel(fileToExpand, AbstractTreeViewer.ALL_LEVELS);
この方法は何もしませんか?
final Tree tree = treeViewer.getTree();
final TreeItem[] items = tree.getSelection();
for (int i = 0; i < items.length; ++i) {
final TreeItem item = items[i];
TreeItem treeParent = item.getParentItem();
while (treeParent != null) {
treeParent.setExpanded(true);
treeParent = treeParent.getParentItem();
}
}
おそらく多分でしょうか?しかし、選択は
treeViewer.expandAll();
このメソッドは、正常に動作...ので、設定されませんが、私はそれが上記の例では、それを試すには良いアイデアだとは思いません。それは、私が欲しいものをやっていないので、とにかく議論のポイントです。
問題は、TreeItem
が遅れて作成されているようです。あなたはこれを試すことができていることを確認するには、次の項目が子を持つか、0でない場合は、しかしない実際のアイテム数
for (final TreeItem item : this.treeViewer.getTree().getItems()) {
System.out.println(item.getData() + " " + item.getItemCount());
}
このメソッドの出力のいずれか1場合。また、子供のデータを取得しようとすると、それはnull
です。
拡張されていないノードを選択するにはどうすればよいですか?ツリーを選択範囲/指定したノードに展開するにはどうすればよいですか?
可能な重複: How to expand a specific node in TreeViewer(org.eclipse.jface)(私はこれは同じ問題であるかどうかわからないんだけど、何の解決策のいずれかの方法はありません)
'expandToLevel'の場合、ツリーを通り、要素だけでなく要素に至るまでの完全なパスを持つ' TreePath'を使ってみてください。 –
@ greg-449しかし、私はどのように道を得るだろうか?この例は 'getParent(Object)'メソッドを持っていますが、このメソッドを持たないように完全に有効です。 –
TreePathでexpandToLevelを使用する場合は、何らかの形でパスを作成する必要があります。 expandToLevelの問題は、ツリーのブランチが一度も展開されていない場合、そのブランチに何が含まれているかについての情報がないため、単一の要素を指定するだけでは機能しないということです。 –