2014-11-10 4 views
0

Возможно ли создать пользовательский интерфейс, который выглядит и ведет себя как дерево SWT, но корни которого не относятся к типу TreeItem, а относятся к типу SWT Tree?UI, который выглядит и ведет себя как дерево SWT

Пример (развернуть/свернуть):

Tree 1 
    Child 1 
    Child 2 
Tree 2 
    Child 1 
    Child 2 


>Tree 1 
>Tree 2 

Добавить новый "Ребенок 3" к "Дерево 1":

Tree 1 
    Child 1 
    Child 2 
    Child 3 
Tree 2 
    Child 1 
    Child 2 

Вот что я пробовал:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Tree; 
import org.eclipse.swt.widgets.TreeItem; 

public class LayoutExperiments { 
    public static void main(String[] args) { 
     Display display = new Display(); 

     final Shell shell = new Shell(display); 
     shell.setText("SWT Trees"); 
     shell.setLayout(new FillLayout()); 
     shell.setSize(400, 300); 

     GridLayout gridLayout = new GridLayout(1, true); 
     gridLayout.marginHeight = 0; 
     gridLayout.verticalSpacing = 0; 
     shell.setLayout(gridLayout); 

     final Tree tree1 = new Tree(shell, SWT.SINGLE); 
     createSomeNodes(tree1, "Tree 1"); 

     final Tree tree2 = new Tree(shell, SWT.SINGLE); 
     createSomeNodes(tree2, "Tree 2"); 

     tree1.addListener(SWT.Expand, new Listener() { 

      @Override 
      public void handleEvent(Event event) { 
       shell.layout(); 
      } 
     }); 

     tree1.addListener(SWT.Collapse, new Listener() { 

      @Override 
      public void handleEvent(Event event) { 
       shell.layout(); 
      } 
     }); 

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 

    private static void createSomeNodes(Tree tree, String rootName) { 
     TreeItem root = new TreeItem(tree, SWT.NONE); 
     root.setText(rootName); 
     for (int i = 0; i < 10; i++) { 
      TreeItem child = new TreeItem(root, SWT.NONE); 
      child.setText("Child of " + rootName); 
     } 
    } 
} 

Но, к сожалению, это не работает, как я ожидаю.

+1

Не совсем уверен, что я понимаю. SWT 'Tree' может иметь несколько видимых« корней »(« Дерево 1 »и« Дерево 2 »). Разве это не то, что вы хотите? – Baz

+0

@Baz Да, я знаю, что дерево SWT может иметь более одного «корня», которые имеют тип TreeItem. Но в моем случае уже много деревьев с собственными слушателями, меню (некоторые из них позволяют сделать один выбор, а некоторые нет), которые я не хочу переделывать и объединять в одно дерево SWT. Мне легче сделать их похожими на одно SWT-дерево. – ka3ak

+0

Это справедливо. Я просто не мог сказать, о чем вы спрашивали, исходя из вопроса. Рад, что вы нашли решение. – Baz

ответ

0

Я нашел решение здесь Fire event after expand/collapse tree

Моя проблема заключалась в том, что дерево еще не расширен, когда SWT.Expand слушатель выполняется. Поэтому его размер не может быть рассчитан правильно.

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