【问题标题】:Auto resize columns when items expand项目展开时自动调整列大小
【发布时间】:2010-07-07 14:15:33
【问题描述】:

在具有多列的树中,如何在展开/折叠和数据更新时将列的大小调整为内容?

类似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

【问题讨论】:

    标签: java user-interface tree swt


    【解决方案1】:

    snippet 显示您的问题会使这更容易。

    解决此问题所需要做的就是将侦听器的代码放入 asyncExec 块中,以推迟其执行。 (我有一种似曾相识的感觉,因为我最近用相同的技巧回答了另一个问题......)

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

    现在工作的 sn-p,取自 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();
       }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多