2010-07-07 6 views
3

Dans un arbre comportant plusieurs colonnes, comment redimensionner les colonnes en contenu lors de l'expansion/réduction et de la mise à jour des données? La solution au problème question for tables ne fonctionne pas.Redimensionner automatiquement les colonnes lorsque les éléments se développent

Identique:

tree.addListener(SWT.Collapse, new Listener(){ 
    @Override 
    public void handleEvent(Event e) { 
    expandAndResize(false, (TreeItem) e.item); 
    } 
    }); 

    tree.addListener(SWT.Expand, new Listener() { 
    @Override 
    public void handleEvent(Event event) { 
    expandAndResize(false, (TreeItem) event.item); 
    } 
    }); 

private static void expandAndResize(Boolean expand_, TreeItem item_) 
{ 
    System.out.println((expand_?"Expanding":"Collapsing") + "item={" + item_ + "}"); 
    item_.setExpanded(expand_); 
    System.out.println(" Resizing columns"); 
    resizeTree(item_.getParent()); 
} 

private static void resizeTree(Tree tree_) 
{ 
    for (TreeColumn tc: tree_.getColumns()) 
    resizeTreeColumn(tc); 
} 

private static void resizeTreeColumn(TreeColumn treeColumn_) 
{ 
    treeColumn_.pack(); 
} 

Cela fonctionne pour les mises à jour de données (en appelant le resizeTree), mais pour déplie/replie il est un pas en arrière! Plus précisément, si je développe un élément dans la première colonne et que l'élément sous-jacent est plus long que la largeur de la colonne, le redimensionnement à cette largeur sera effectué lors d'un prochain repli ou développement d'un autre élément (ou si appeler directement resizeTree).

Juste au cas où il est important: les données est donnée par TreeContentProvider et ITableLabelProvider, et je suppose que ITableLabelProvider pourrait causer le problème (la largeur de la colonne est ajustée avant que l'étiquette est généré ?!)

X-posted to Eclipse Community Forum

Répondre

5

Un snippet montrant votre problème aurait rendu cette tâche plus facile.

Tout ce que vous avez à faire pour résoudre ce problème est de mettre le code de votre écouteur dans un bloc asyncExec, pour en reporter l'exécution. (J'ai un déjà-vu, puisque j'ai répondu à une autre question avec le même conseil très récemment ...)

BTW: Vous n'avez pas besoin d'appeler TreeItem.setExpanded (.). N'utilisez pas Boolean lorsque vous avez un type primitif. Cela fonctionne, mais la VM fait de la boxe automatique tout le temps, ce qui n'est pas bon pour la performance. Cela n'a pas d'importance ici, mais c'est un mauvais habbit. Et puis: Underscore suffixes pour les variables?

maintenant l'extrait de travail, prise et adapté de here:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.*; 

public class Snippet { 

    public static void main(String[] args) { 
     final Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new FillLayout()); 
     final Tree tree = new Tree(shell, SWT.BORDER); 
     tree.setHeaderVisible(true); 
     TreeColumn col1 = new TreeColumn(tree, 0); 
     col1.setText("col1"); 
     TreeColumn col2 = new TreeColumn(tree, 0); 
     col2.setText("col2"); 

     for (int i = 0; i < 4; i++) { 
     TreeItem iItem = new TreeItem(tree, 0); 
     iItem.setText(new String[] { "TreeItem (0) -" + i, "x" }); 
     for (int j = 0; j < 4; j++) { 
      TreeItem jItem = new TreeItem(iItem, 0); 
      jItem.setText(new String[] { "TreeItem (1) -" + i, "x" }); 
      for (int k = 0; k < 4; k++) { 
       TreeItem kItem = new TreeItem(jItem, 0); 
       kItem.setText(new String[] { "TreeItem (2) -" + i, "x" }); 
       for (int l = 0; l < 4; l++) { 
        TreeItem lItem = new TreeItem(kItem, 0); 
        lItem.setText(new String[] { "TreeItem (3) -" + i, "x" }); 
       } 
      } 
     } 
     } 

     col1.pack(); 
     col2.pack(); 

     Listener listener = new Listener() { 

     @Override 
     public void handleEvent(Event e) { 
      final TreeItem treeItem = (TreeItem)e.item; 
      display.asyncExec(new Runnable() { 

       @Override 
       public void run() { 
        for (TreeColumn tc : treeItem.getParent().getColumns()) 
        tc.pack(); 
       } 
      }); 
     } 
     }; 

     tree.addListener(SWT.Collapse, listener); 
     tree.addListener(SWT.Expand, listener); 

     shell.setSize(200, 200); 
     shell.open(); 
     while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 
    } 
} 
+0

merci pour une réponse détaillée, vais essayer dès que possible – MadH

+0

fonctionne très bien, et il est en effet un double de http://stackoverflow.com/ questions/3148123/changement-étiquettes-dans-un-jface-treeviewer-sur-nœud-expansion-effondrement/3226914 # 3226914 – MadH

Questions connexes