如何在Eclipse RCP应用程序中创建可滚动视图?

时间:2011-10-17 09:21:08

标签: java eclipse-plugin eclipse-rcp

到目前为止我尝试了什么:

在createPartControl中:

ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
        sc.setLayoutData(new GridData(GridData.FILL_BOTH));
        sc.setExpandVertical(true);
        sc.setExpandHorizontal(true);
        sc.setSize(ApplicationWorkbenchWindowAdvisor.WIDTH, ApplicationWorkbenchWindowAdvisor.HEIGHT);
        final TabFolder tabFolder = new TabFolder(sc, SWT.TOP);

但这不起作用。我的问题是,如果我调整程序窗口的大小,滚动条不会出现在我的视图中。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

Javadoc of ScrolledComposite描述了使用它的两种方式,包括示例代码。总结一下:

  1. 您可以在控件/合成本身上设置ScrolledComposite中包含的控件/合成的大小
  2. 或者告诉您ScrolledComposite用于其内容的最小尺寸。
  3. 目前,你们两个都没做。您在ScrolledComposite上设置了大小,但除非您不使用布局管理器,否则这没有多大意义。在任何情况下,请参阅上面的链接以获取一些官方示例代码。

答案 1 :(得分:6)

通常在Eclipse视图中,我希望我的控件获取所有可用空间,并且只显示滚动条,否则控件将缩小到可用大小以下。

其他答案完全有效,但我想添加一个createPartControl方法的完整示例(Eclipse e4)。

@PostConstruct
public void createPartControl(Composite parent) {
    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    composite.setLayout(new GridLayout(2, false));

    Label label = new Label(composite, SWT.NONE);
    label.setText("Foo");

    Text text = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
    GridDataFactory.fillDefaults().grab(true, true).hint(400, 400).applyTo(text);

    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}

请注意,.fillDefaults()隐含.align(SWT.FILL, SWT.FILL)

我通常使用这种模式,所以我创建了以下小帮手方法:

public static ScrolledComposite createScrollable(Composite parent, Consumer<Composite> scrollableContentCreator) {
    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    scrollableContentCreator.accept(composite);

    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    return sc;
}

感谢Java 8 lambdas,您现在可以以非常紧凑的方式实现新的可滚动复合:

    createScrollable(container, composite -> {
        composite.setLayout(new FillLayout());
        // fill composite with controls
    });

答案 2 :(得分:4)

这是一小段代码,对我有用:

    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    Label lblRelation = new Label(composite, SWT.NONE);
    lblRelation.setBounds(10, 13, 74, 15);
    lblRelation.setText("Label name:");
    composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));