Layout Eclipse rcp布局问题

Layout Eclipse rcp布局问题,layout,swt,scrollbar,eclipse-rcp,composite,Layout,Swt,Scrollbar,Eclipse Rcp,Composite,我面临着一个编辑及其内容布局的问题。其内容如下:有一个具有打印预览功能的编辑器,编辑器的主要部分由回形针打印预览组件获取,左侧有一个带有一些按钮的组合(请参见屏幕截图1) 如您所见,PrintPreview位于ScrolledComposite内部 问题是:当我在编辑器下调整窗口或视图的大小时,底部滚动条在视图下移动,因此消失。之后无法水平滚动(不显示编辑器滚动条)。请参阅屏幕快照2(底部滚动条被隐藏) 当编辑器的高度小于右组合的高度时,它开始隐藏(在最后一个按钮下面有更多的小部件,我刚刚删除

我面临着一个编辑及其内容布局的问题。其内容如下:有一个具有打印预览功能的编辑器,编辑器的主要部分由回形针打印预览组件获取,左侧有一个带有一些按钮的组合(请参见屏幕截图1)

如您所见,PrintPreview位于ScrolledComposite内部

问题是:当我在编辑器下调整窗口或视图的大小时,底部滚动条在视图下移动,因此消失。之后无法水平滚动(不显示编辑器滚动条)。请参阅屏幕快照2(底部滚动条被隐藏)

当编辑器的高度小于右组合的高度时,它开始隐藏(在最后一个按钮下面有更多的小部件,我刚刚删除了它们)

如果我正在缩小窗口,那么右组合永远不会失去它的宽度,并且总是可见的(参见屏幕截图3-它不允许调整的大小超过这个)

复合材料的创建方式如下:

   @Override
    public void createPartControl(final Composite parent) {

        GridLayout gridLayout = new GridLayout(2, false);
        parent.setLayout(gridLayout);

        // Scroll area for the print area
        scroll = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        final GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.widthHint = 1;
        gridData.heightHint = 1;
        scroll.setLayoutData(gridData);
        scroll.setExpandHorizontal(true);
        scroll.setExpandVertical(true);

// Button area
        final Composite buttonArea = new Composite(parent, SWT.FLAT);
        final GridData layoutData = new GridData(SWT.FILL, SWT.TOP, false, false);
        buttonArea.setLayoutData(layoutData);
        gridLayout = new GridLayout(1, false);
        buttonArea.setLayout(gridLayout);
问题是:如何避免底部滚动条消失?我是否可以拥有与右组合宽度相同的行为-不可能调整大小小于右组合高度?或者,如果超过某个最小高度限制,如何在整个编辑器上显示滚动条

我在不同的复合材料上尝试了不同的方法,比如设置minimumHeight和heightHint,在Scrolled复合材料中添加buttonsArea(只是为了好玩)等等,但没有任何帮助

有人知道快速解决方案吗?谢谢。

请参阅此SO帖子:

您需要侦听内容组合上的宽度更改 (mParent),再次计算给定新内容的最小高度 宽度,并使用新的 高度

如果上面的文章没有看上去那么有用,那么就共享一些最小的编译和可执行代码来复制问题。另外,提到eclipse/swt版本、OS和JDK版本,它有助于分析问题


调整事件大小和输出的演示代码!! 代码: 输出:
实际尺寸

垂直调整大小

水平调整大小


谢谢您的回答!我已经尝试过你的解决方案,它正在发挥作用。通过将按钮区域的布局数据更改为grabeExcessVerticalSpace=true,并将GridData添加到verticalAlign=FILL的所有子级,我已经解决了这个问题。乍一看,它似乎也有同样的行为,你可能不那么优雅。干杯
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class ScrolledCompositeTest
{
    public static void main (String [] args)
    {
          Display display = new Display ();
          Shell shell = new Shell (display);
          shell.setLayout(new FillLayout());

          GridLayout layout = new GridLayout();
          layout.numColumns = 4;

          // set the minimum width and height of the scrolled content - method 2
          final ScrolledComposite sc2 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
          sc2.setExpandHorizontal(true);
          sc2.setExpandVertical(true);
          final Composite c2 = new Composite(sc2, SWT.NONE);
          sc2.setContent(c2);
          layout = new GridLayout();
          layout.numColumns = 7;
          c2.setLayout(layout);
          Button b2 = new Button (c2, SWT.PUSH);
          b2.setText("first button");
          sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));

          Button add = new Button (shell, SWT.PUSH);
          add.setText("add children");
          final int[] index = new int[]{0};
          add.addListener(SWT.Selection, new Listener() {
              public void handleEvent(Event e) {
                  index[0]++;
                  Button button = new Button(c2, SWT.PUSH);
                  button.setText("button "+index[0]);
                  sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                  c2.layout();
              }
          });

          shell.open ();
          while (!shell.isDisposed ()) {
              if (!display.readAndDispatch ()) display.sleep ();
          }
          display.dispose ();
     }
}