ScrolledComposite不会在SashForm中滚动

时间:2012-09-17 13:22:57

标签: java layout swt

我有以下SWT布局:

  • TabItem的
    • SashForm
      • 复合(GridLayout)
        • 标签(填写W,抓H)
        • ScrolledComposite(填写W / H,Grab H / V)
          • 复合(RowLayout)
      • 复合(GridLayout)
        • 标签(填写W,抓H)
        • ScrolledComosite(填写W / H,Grab H / V)
          • 复合(RowLayout)

一般的想法是,有两个相同的窗格并排通过窗框可调节宽度,每个面板内部是顶部的标签,底部是滚动的复合材料。滚动的复合材料将包含许多(1 - 50)100x100复合材料。

问题是,当包含在窗扇形式中时,由于大量子节点,内部合成增长时滚动的合成将不会滚动。当我放弃SashForm并使用常规Composite时,我没有遇到这个问题,如下所示:

  • TabItem的
    • 复合(GridLayout)
      • 标签
      • ScrolledComposite
        • 组合
      • 标签
      • ScrolledComposite
        • 组合

通过这种方式,没有额外的复合容器,一切都在网格布局中。唯一的问题是我无法通过公共接口(窗扇)调整窗格的宽度。


我尝试使用layout()强制布局,并使用setMinSize()设置最小尺寸。我尝试使用FlowLayout(swing2swt)交换RowLayout。我假设这是一种布局问题,但我没有足够的SWT经验来解决它。除滚动问题外,布局是完美的。

来源示例

所有代码都是由WindowBuilder Pro自动生成的,可以通过构建我指定的复合树来复制。这是我用来填充包装复合的片段:

public void populate(Composite composite, List<Photo> items) {
   composite.setRedraw(false);
   for (Photo photo : photos) {
     PhotoComposite composite = new PhotoComposite(composite, photo, SWT.NONE);
     composite.setSize(100, 100);
   }
   composite.setRedraw(true);
   composite.layout(true);
}

Photo是一个简单的POJO,PhotoComposite是一个自定义合成,除了传统的Composite和样式位之外,它还将Photo作为构造函数中的参数。根据我的实验,此代码似乎工作正常。

1 个答案:

答案 0 :(得分:0)

事实证明问题是对setMinSize(int, int)的误解。上面显示的populate方法的以下更改为我解决了问题:

public void populate(ScrolledComposite scroll, Composite composite, List<Photo> items) {
   composite.setRedraw(false);
   for (Photo photo : photos) {
     PhotoComposite composite = new PhotoComposite(composite, photo, SWT.NONE);
     composite.setSize(100, 100);
   }
   composite.setRedraw(true);
   composite.layout(true);

   scroll.setMinSize(composite.computeSize(scroll.getSize().x, SWT.DEFAULT));
}