2013-07-03 1 views
1

Je veux obtenir un tableau de tous les TreeItems de mon arbre SWT. Toutefois, la méthode incluse dans la classe Tree, getItems() renvoie uniquement les éléments qui se trouvent sur le premier niveau de l'arborescence (c'est-à-dire qui ne sont pas enfants de quoi que ce soit).Obtenir tous les TreeItems dans un arbre SWT

Quelqu'un peut-il suggérer un moyen d'obtenir tous les enfants/articles?

Répondre

5

La documentation de Tree#getItems() est très spécifique:

Renvoie un (éventuellement vide) tableau d'éléments contenus dans le récepteur qui sont des enfants d'article directement du récepteur. Ce sont les racines de l'arbre.

Voici quelques exemples de code qui fait l'affaire:

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new FillLayout()); 

    final Tree tree = new Tree(shell, SWT.MULTI); 

    TreeItem parentOne = new TreeItem(tree, SWT.NONE); 
    parentOne.setText("Parent 1"); 
    TreeItem parentTwo = new TreeItem(tree, SWT.NONE); 
    parentTwo.setText("Parent 2"); 

    for (int i = 0; i < 10; i++) 
    { 
     TreeItem item = new TreeItem(parentOne, SWT.NONE); 
     item.setText(parentOne.getText() + " child " + i); 

     item = new TreeItem(parentTwo, SWT.NONE); 
     item.setText(parentTwo.getText() + " child " + i); 
    } 

    parentOne.setExpanded(true); 
    parentTwo.setExpanded(true); 

    List<TreeItem> allItems = new ArrayList<TreeItem>(); 

    getAllItems(tree, allItems); 

    System.out.println(allItems); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

private static void getAllItems(Tree tree, List<TreeItem> allItems) 
{ 
    for(TreeItem item : tree.getItems()) 
    { 
     getAllItems(item, allItems); 
    } 
} 

private static void getAllItems(TreeItem currentItem, List<TreeItem> allItems) 
{ 
    TreeItem[] children = currentItem.getItems(); 

    for(int i = 0; i < children.length; i++) 
    { 
     allItems.add(children[i]); 

     getAllItems(children[i], allItems); 
    } 
} 
+1

Bonne réponse, mais notez que la liste des AllItems ne comprend pas les éléments racine renvoyés par tree.getItems(). –

+1

Note: Pour l'obtenir @HennoVermeulen et tout, il suffit d'ajouter 'allItems.add (item);' comme première déclaration dans la boucle à l'intérieur de '#getAllItems (Tree, List )'. – Campa

+0

@Baz: quand Tree est au niveau N alors ça a fonctionné ou pas? –

Questions connexes