ScrolledComposite父级使用GridLayout

时间:2012-07-05 08:23:17

标签: java swt scrolledcomposite

我希望ScrolledComposite的父级有GridLayout,但滚动条不会显示,除非我使用FillLayout。我对FillLayout的问题是它的子节点占用了可用空间的相等部分。

在我的情况下,有两个小部件,顶部的小部件不应超过窗口的1/4,ScrolledComposite应占用剩余空间。但是,它们都占了一半。

有没有办法将GridLayoutScrolledComposite一起使用,还是可以修改FillLayout的行为?

这是我的代码:

private void initContent() {

    //GridLayout shellLayout = new GridLayout();
    //shellLayout.numColumns = 1;
    //shellLayout.verticalSpacing = 10;
    //shell.setLayout(shellLayout);
    shell.setLayout(new FillLayout(SWT.VERTICAL));

    searchComposite = new SearchComposite(shell, SWT.NONE);
    searchComposite.getSearchButton().addListener(SWT.Selection, this);

    ScrolledComposite scroll = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    scroll.setLayout(new GridLayout(1, true));

    Composite scrollContent = new Composite(scroll, SWT.NONE);
    scrollContent.setLayout(new GridLayout(1, true));

    for (ChangeDescription description : getChanges(false)) {
        ChangesComposite cc = new ChangesComposite(scrollContent, description);
    }

    scroll.setMinSize(scrollContent.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    scroll.setContent(scrollContent);
    scroll.setExpandVertical(true);
    scroll.setExpandHorizontal(true);
    scroll.setAlwaysShowScrollBars(true);

}

3 个答案:

答案 0 :(得分:3)

除了setLayout()之外,还需要调用setLayoutData()。在下面的代码示例中,查看如何构造GridData对象并将其传递给两个setLayoutData()调用中的每一个。

private void initContent(Shell shell)
{
    // Configure shell
    shell.setLayout(new GridLayout());

    // Configure standard composite
    Composite standardComposite = new Composite(shell, SWT.NONE);
    standardComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));

    // Configure scrolled composite
    ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
    scrolledComposite.setLayout(new GridLayout());
    scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    scrolledComposite.setExpandVertical(true);
    scrolledComposite.setExpandHorizontal(true);
    scrolledComposite.setAlwaysShowScrollBars(true);

    // Add content to scrolled composite
    Composite scrolledContent = new Composite(scrolledComposite, SWT.NONE);
    scrolledContent.setLayout(new GridLayout());
    scrolledComposite.setContent(scrolledContent);
}

答案 1 :(得分:2)

NB!此答案基于Eclipse RAP,其行为可能与常规SWT不同。

几天前,我正在努力解决同样的问题。我在同一页面上有两个ScrolledComposite,我需要左边的那个不需要更多的空间(即使空间可用)。

在尝试不同的解决方案时,我注意到ScrolledComposite的行为取决于其LayoutData,如下所示:

  • 如果layoutData设置为new GridData(SWT.LEFT, SWT.TOP, false, true),则无论父ScrolledComposite尺寸发生变化,Composite都会保持其预期尺寸。
  • 如果layoutData设置为new GridData(SWT.LEFT, SWT.TOP, true, true),则ScrolledComposite将根据父Composite的尺寸变化缩小/展开。这还包括扩展到所需的更大宽度(意味着列保持相等)。

基于这种行为,我能够通过向父Composite添加调整大小监听器来解决问题,该监听器根据父{{1}更改左layoutData的{​​{1}} }}

以下示例说明了这种方法:

ScrolledComposite

然而,这种方法在我看来似乎有点过于“hackish”的解决方案。因此,我希望看到更好的方法。

答案 2 :(得分:1)

我认为你在这里缺少的是为孩子们定义GridData

布局控制孩子的位置和大小。每个布局类都有一个相应的布局数据类,允许在布局中配置每个特定的子节点,如果它们填满整个空间,它们占用的单元格数等等。

我猜你的网格布局可能有4行,顶部的小部件只占用一个单元格,另一个小部件占用其余的单元格(3)。这是通过GridData.verticalSpan属性实现的。

查看Understanding Layouts in SWT并尝试不同的布局数据属性,看看他们做了什么。