2010-07-07 3 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).

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

X-posted to Eclipse Community Forum

ответ

5

A snippet, показывающий вашу проблему, упростил бы это.

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

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

Теперь рабочий фрагмент, взятый и адаптированный из 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

+0

прекрасно работает, и это действительно дубликат http://stackoverflow.com/ вопросы/3148123/изменения-метка-в-JFace-TreeViewer-на-узла-расширение коллапс/3226914 # 3226914 – MadH

Смежные вопросы