2010-07-07 20 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