2010-07-07 55 views
3

在多列的树,我该如何调整列在展开/折叠和数据更新的内容?自动调整列宽时,项目拓展

的解决类似question for tables不起作用。

同:

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(); 
} 

这适用于数据更新(通过调用resizeTree),但展开/折叠它是落后一步!

更具体地说,如果我展开第一列中的一个项目,并且基础项目比列宽度更长,那么将在下一个折叠或展开某个其他项目时完成对该宽度的调整大小(或者如果我直接拨打resizeTree)。

万一是很重要的:数据被TreeContentProviderITableLabelProvider给出,我的猜测是,(之前的标签获取生成?列的宽度调整)

ITableLabelProvider可能导致问题X-posted to Eclipse Community Forum

回答

5

一个snippet显示您的问题将做更容易些。

所有你需要做的解决这个问题,是把你的听众代码为asyncExec块,推迟执行。 (我有一个似曾相识,因为我最近回答了另一个问题,最近也有同样的提示......)

顺便说一句:你不必调用TreeItem.setExpanded(。)。另外,当你有一个原始类型时不要使用布尔值。它可以工作,但虚拟机会一直进行自动装箱,这对性能不利。这并不重要,但这是一个糟糕的习惯。然后:下划线后缀的变量?

现在的工作片断,采取和改编自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

感谢,会尝试尽快 – MadH 2010-07-11 16:31:16

+0

工作正常,并且这的确是http://stackoverflow.com/的副本问题/ 3148123 /改变的标签-IN-A-JFace的-的TreeViewer上节点 - 膨胀 - 崩溃/ 3226914#3226914 – MadH 2010-07-12 08:37:23