项目展开时自动调整列大小 [英] Auto resize columns when items expand

查看:112
本文介绍了项目展开时自动调整列大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In a tree with multiple columns, how do I resize columns to contents upon expand/collapse and data updates?

类似的解决方案表格问题不起作用。

同样如下:

  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 ),但对于扩展/折叠,它落后一步!

This works for data updates (by calling the resizeTree), but for expands/collapses it is one step behind!

更具体地说,如果我在第一列中展开一个项目,并且基础项目的长度大于列宽度,则调整该宽度的大小将在下一个列中完成折叠或扩展其他一些项目(或者如果我直接调用 resizeTree )。

More specifically, if I expand an item in the first column, and the underlying item is longer than the column width, the resize to that width will be done upon a next collapse or expand of some other item (or if I directly call resizeTree).

以防万一重要:数据由 TreeContentProvider ITableLabelProvider 提供,我的猜测是 ITableLabelProvider 可能会导致问题(在生成标签之前调整列的宽度?!)

Just in case it is important: the data is given by TreeContentProvider and ITableLabelProvider, and my guess is that ITableLabelProvider might cause the problem (the width of the column is adjusted before the label gets generated?!)

X-posted to Eclipse Community Forum

推荐答案

A 代码段显示您的问题会让这更容易。

A snippet showing your issue would have made this easier.

要解决此问题,您需要将侦听器的代码放入asyncExec块,以推迟执行。 (我有一个deja-vu,因为我最近用同一个提示回答了另一个问题...)

All you have to do to fix this, is put your listener's code into an asyncExec block, to postpone its execution. (I have a deja-vu, since I answered another question with the same tip very recently...)

BTW:你不必调用TreeItem.setExpanded (。)。此外,如果您具有基本类型,请不要使用布尔值。它可以工作,但VM一直在自动装箱,这对性能不利。这没关系,但这是一个糟糕的习惯。然后:变量的下划线后缀?

BTW: You don't have to call TreeItem.setExpanded(.). Also, don't use Boolean when you have a primitive type. It works, but the VM does auto boxing all the time, which isn't good for performance. That doesn't matter here, but it's a bad habbit. And then: Underscore suffixes for variables?

现在的工作片段,取自这里

Now the working snippet, taken and adapted from 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();
   }
}

这篇关于项目展开时自动调整列大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆