【问题标题】:SWT: How to use only one scrollbar to scroll two seaparate viewersSWT:如何仅使用一个滚动条来滚动两个独立的查看器
【发布时间】:2013-07-16 09:09:38
【问题描述】:

我将两个 TreeViewers 放入 SWT Shell

它们都有自己的滚动条。但是,我希望Shell 中只有一个Scrollbar,它同时控制两个TreeViewers 的滚动。

我能找到的唯一示例是在源比较视图中。但是,我看不出他们是怎么做到的——我已经尝试了一段时间。但至少我知道这是可能的。

有什么建议吗?

编辑

我的最终界面应该在左侧有两个TreeViewers 和一个Scrollbar 来控制它们。

【问题讨论】:

  • 你的意思是他们都有一个滚动条,但是移动一个会移动另一个,还是你想要一个滚动条来移动两个组合?
  • 它们都有自己的滚动条,可以独立移动它们。我想有一个滚动条同时移动(两棵树总是相同的大小)。 (P.S. 很高兴你加入 @Baz :)
  • 所以你一共要 3 个?
  • 不,我想要一个。一个滚动条来统治他们。
  • 如果您最终找到解决方案,请在此处发布。

标签: java swt scrollbar jface treeviewer


【解决方案1】:

这应该可以帮助您。当我将SWT.NO_SCROLL 用于Tree 时,它会停止滚动,但Table 会隐藏垂直滚动条,并且在设置顶部索引时会滚动表格。

使用setTopItem(TreeItem)-read 文档(因为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();

【讨论】:

    【解决方案2】:

    这里有一些代码应该帮助你,但它不是一个解决方案。

    我不知道如何添加一个模仿其他滚动条的附加滚动条。我所做的是将两个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;
    }
    

    【讨论】:

    • 问题是我无法将 TreeViewers 添加到 ScrolledComposite
    • @Imray 为什么不呢?嗯,你不能把同样的想法应用到TreeViewers 上吗?
    • @Imray This 可能会有所帮助。
    • @Imray This 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2015-12-06
    • 2011-05-18
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多