【问题标题】:org.eclipse.swt.widgets.Composite setSize not working properlyorg.eclipse.swt.widgets.Composite setSize 无法正常工作
【发布时间】:2020-05-04 19:44:23
【问题描述】:

我目前正在开发一个自定义插件,但我不太明白为什么即使存在其他 Composite 元素,Composite 元素也会占用所有空间。

我的插件执行处理程序是这样的:

public class IwokGeneratorHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {

        IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
        Shell shell = window.getShell();
        ApplicationWindow win = new ApplicationWindow(shell) {

            @Override
            protected Control createContents(Composite parent) {

                parent.setSize(800, 600);
                //first panel
                Composite composite = new Composite(parent, SWT.NONE);
                //x, y, width, height
                composite.setBounds(10, 10, 424, 70);

                //second panel
                Composite composite_1 = new Composite(parent, SWT.NONE);
                composite_1.setBounds(10, 86, 424, 309);

                //third panel
                Composite composite_2 = new Composite(parent, SWT.NONE);
                composite_2.setBounds(10, 407, 424, 42);

                return parent;
            }
        };
        win.open();
        return null;
    }
}

但是,第一个 Composite 占用了主应用程序窗口的所有空间,而其他的则无法看到,无论窗口大小如何。我检查了很多次。

我是否缺少任何属性来防止元素自动填充?

提前谢谢你

【问题讨论】:

标签: java eclipse eclipse-plugin swt jface


【解决方案1】:

ApplicationWindow 期望 createContents 方法返回包含内容中所有控件的单个 Composite(与大多数其他 JFace 窗口和对话框类一样)。

比如:

  protected Control createContents(final Composite parent) {

      parent.setSize(800, 600);

      // Main body composite
      Composite body = new Composite(parent, SWT.NONE);

      //first panel
      Composite composite = new Composite(body, SWT.NONE);
      //x, y, width, height
      composite.setBounds(10, 10, 424, 70);

      //second panel
      Composite composite_1 = new Composite(body, SWT.NONE);
      composite_1.setBounds(10, 86, 424, 309);

      //third panel
      Composite composite_2 = new Composite(body, SWT.NONE);
      composite_2.setBounds(10, 407, 424, 42);

      // Return the body
      return body;
  }

请注意,您的代码也返回了 parent,这是错误的 - 它必须是创建的组合。

注意:虽然使用setBounds 可能看起来很简单,但如果代码在具有不同字体大小的不同机器上运行(或者如果您在 macOS/Linux/Windows 上运行则控制大小)会导致问题。强烈建议使用 Layouts。

【讨论】:

  • 是的,我现在明白了。如您所说,正确使用主要复合材料就可以了。我也会听取有关布局的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2015-11-12
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
相关资源
最近更新 更多