2013-07-17 3 views
4

Я кладу два TreeViewers в SWT Shell.SWT: Как использовать только одну полосу прокрутки для прокрутки двух seaparate зрителей

У каждого из них свои полосы прокрутки. Тем не менее, я хотел бы иметь только один Scrollbar в Shell, который контролирует прокрутку как TreeViewers одновременно.

Единственный пример этого, который я смог найти, находится в окне сравнения источников. Однако я не вижу, как они это сделали - я пытался понять это на некоторое время. Но, по крайней мере, я знаю, что это возможно.

Любые предложения?

EDIT

Мой окончательный интерфейс должен иметь два TreeViewers и один Scrollbar слева, чтобы контролировать их обоих.

+0

Вы имеете в виду, что у них обоих есть полоса прокрутки, но перемещение одного приведет к перемещению другого или вы хотите, чтобы какой-нибудь прокручиваемый пробел перемещал оба композита? – Baz

+0

У них обоих есть своя полоса прокрутки, перемещающая каждую из них независимо. Я хотел бы иметь одну полосу прокрутки, которая перемещает оба в одно и то же время (оба дерева всегда одного размера). (P.S. Рад, что вы на борту @Baz :) – CodyBugstein

+0

Итак, вы хотите 3 всего? – Baz

ответ

0

Вот код, который должен помочь вы, но это не решение.

Я не мог понять, как добавить дополнительную полосу прокрутки, которая имитирует остальные. То, что я действительно достиг, заключается в том, чтобы связать движения полосы прокрутки двух ScolledComposites. Возможно, это поможет вам немного в ваших усилиях ...

private static ScrolledComposite[] comps = new ScrolledComposite[2]; 

public static void main(String[] args) 
{ 
    Display display = Display.getDefault(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 

    createComposite(0, shell); 
    createComposite(1, shell); 

    shell.pack(); 
    shell.setSize(300, shell.getSize().y); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

private static void createComposite(final int position, Shell parent) 
{ 
    ScrolledComposite scrolled = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 

    Composite content = new Composite(scrolled, SWT.BORDER); 
    content.setLayout(new GridLayout(3, true)); 

    for(int i = 0; i < 9; i++) 
    { 
     Button button = new Button(content, SWT.PUSH); 
     button.setText("Button " + i); 
    } 

    scrolled.setExpandHorizontal(true); 
    scrolled.setExpandVertical(true); 
    scrolled.setMinSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scrolled.setContent(content); 

    scrolled.getHorizontalBar().addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event e) 
     { 
      if(e.detail == SWT.DRAG) 
      { 
       ScrolledComposite source = comps[position]; 
       ScrolledComposite target = comps[(position + 1) % comps.length]; 
       int value = source.getHorizontalBar().getSelection(); 
       target.setOrigin(value, target.getOrigin().y); 
      } 
     } 
    }); 

    comps[position] = scrolled; 
} 
+0

Проблема в том, что я не могу добавить TreeViewers в ScrolledComposite – CodyBugstein

+0

@Imray Почему бы и нет? Mhm, не можете ли вы применить ту же идею к 'TreeViewer'? – Baz

+0

@Imray [This] (http://stackoverflow.com/questions/8964914/vertical-align-2-jface-treeviewers-to-specific-element) может оказаться полезным. – Baz

2

Это должно помочь вам. Когда я использовал SWT.NO_SCROLL для Tree, он останавливал прокрутку, но Table, он прячет вертикальную полосу прокрутки, а таблица была прокручена, когда установлен верхний индекс.

Дерево

использование setTopItem(TreeItem) -Распознать документации (как TreeItem имеет дочерние элементы)

Таблица

использование setTopIndex(int index)

пример:

Display display = new Display(); 
Shell shell = new Shell(display); 
shell.setLayout(new GridLayout(2,false)); 
final Tree tree1 = new Tree(shell, SWT.BORDER | SWT.MULTI /*| SWT.NO_SCROLL*/); 

for (int i = 0; i < 128; i++) { 
    TreeItem item = new TreeItem(tree1, SWT.NONE); 
    item.setText("Tree 1 Item" + i); 
} 
GridData data = new GridData(SWT.FILL, SWT.FILL, false, false); 
data.heightHint=200; 
tree1.setLayoutData(data); 



final Tree tree2 = new Tree(shell, SWT.BORDER | SWT.MULTI); 
tree2.setSize(200, 200); 
for (int i = 0; i < 128; i++) { 
    TreeItem item = new TreeItem(tree2, SWT.NONE); 
    item.setText("Tree 2 Item" + i); 
} 
tree2.getVerticalBar().addSelectionListener(new SelectionListener() { 

    @Override 
    public void widgetSelected(SelectionEvent e) { 
    TreeItem item = tree2.getTopItem(); 
    int i = tree2.indexOf(item); 
    item = tree1.getItem(i); 
    tree1.setTopItem(item); 
    } 

    @Override 
    public void widgetDefaultSelected(SelectionEvent e) { 
    } 
}); 
data = new GridData(SWT.FILL, SWT.FILL, false, false); 
data.heightHint=200; 
tree2.setLayoutData(data); 

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