防止SWT ScrolledComposite吃掉它的一部分'孩子们

防止SWT ScrolledComposite吃掉它的一部分'孩子们

巡山小妖精 发布于 2021-10-17 字数 644 浏览 803 回复 4 原文

我做错了什么?
以下是我的代码摘录:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.layout();
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
}

…但它剪辑了最后一个按钮:

大兄弟82:那没用。
我试过你的建议,现在滚动条不见了。我需要做更多的工作。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无人问我粥可暖 2021-10-18 4 楼

布局完成后,尝试在ScrolledComposite上设置.setMinWidth和.setMinHeight,并将主组合的大小传递给它。

伪装你 2021-10-18 3 楼

你不需要在布局之后重新计算滚动框的大小吗?

私藏温柔 2021-10-18 2 楼

如果我没弄错的话,你需要交换

mParent.layout();

mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));

因此,您有:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
  mParent.layout();
}
掩饰不了的爱 2021-10-17 1 楼

这是使用 ScrolledComposite 时常见的障碍。当它变得如此小以至于必须显示滚动条时,客户端控件必须水平收缩以为滚动条腾出空间。这样做的副作用是使一些标签换行,从而将以下控件向下移动得更远,从而增加了内容组合所需的最小高度。
您需要监听内容组合( mParent )上的宽度更改,在给定新内容宽度的情况下再次计算最小高度,并使用新高度调用滚动组合上的 setMinHeight()

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  scrollBox.setExpandVertical(true);

  // Using 0 here ensures the horizontal scroll bar will never appear.  If
  // you want the horizontal bar to appear at some threshold (say 100
  // pixels) then send that value instead.
  scrollBox.setMinWidth(0);

  mParent = new Composite(scrollBox, SWT.NONE);

  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);

  // Adds a bunch of controls here

  mParent.addListener(SWT.Resize, new Listener() {
    int width = -1;
    public void handleEvent(Event e) {
      int newWidth = mParent.getSize().x;
      if (newWidth != width) {
        scrollBox.setMinHeight(mParent.computeSize(newWidth, SWT.DEFAULT).y);
        width = newWidth;
      }
    }
  }

  // Wait until here to set content pane.  This way the resize listener will
  // fire when the scrolled composite first resizes mParent, which in turn
  // computes the minimum height and calls setMinHeight()
  scrollBox.setContent(mParent);
}

在侦听大小更改时,请注意,我们忽略宽度保持不变的任何调整大小事件。这是因为只要宽度相同,内容高度的变化不会影响内容的最小高度。