Автоматическое изменение размера столбцов при расширении элементов - PullRequest
3 голосов
/ 07 июля 2010

Как изменить размер столбцов в содержимом дерева при развертывании / свертывании и обновлении данных в дереве с несколькими столбцами?

Решение аналогичного вопроса для таблиц не работает.

То же, что и:

  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).

На всякий случай, если это важно: данные задаются TreeContentProvider и ITableLabelProvider, и я предполагаю, что ITableLabelProvider может вызвать проблему (ширинастолбца корректируется до создания метки?!)

X-опубликовано на форуме сообщества Eclipse

1 Ответ

5 голосов
/ 09 июля 2010

A фрагмент , показывающий вашу проблему, облегчит эту задачу.

Все, что вам нужно сделать, чтобы это исправить, - поместить код слушателя в блок asyncExec, чтобы отложить его выполнение.(У меня есть дежавю, поскольку я недавно ответил на другой вопрос с тем же советом ...)

Кстати: вам не нужно вызывать TreeItem.setExpanded (.).Кроме того, не используйте Boolean, если у вас есть примитивный тип.Это работает, но виртуальная машина все время выполняет автоматический бокс, что не очень хорошо для производительности.Здесь это не имеет значения, но это плохой навык.А потом: Подчеркивать суффиксы для переменных?

Теперь рабочий фрагмент, взятый и адаптированный из здесь :

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