WindowBuilder:在应用程序窗口内切换复合

问题描述

我有一个应用程序窗口,我想根据几种情况在其中显示不同的组件。

package graphicalInterface;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.RowLayout;

public class parentwindow {
    protected Shell shell;
    
    public void open() {
        display display = display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isdisposed()) {
            if (!display.readAnddispatch()) {
                display.sleep();
            }
        }
    }
    
    protected void createContents() 
    {
        shell = new Shell();
        shell.setSize(600,400);
        shell.setText("Test");
        shell.setLayout(new RowLayout(SWT.HORIZONTAL));
        menu myMenu = new menu(shell,SWT.NONE);    
        menu myMenu2 = new menu(shell,SWT.NONE);   
        menu myMenu3 = new menu(shell,SWT.NONE);   
    }
}

复合读取

package graphicalInterface;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;

public class menu extends Composite {
    public menu(Composite parent,int style) {
        super(parent,SWT.NONE);
        
        Button btnAzLicht = new Button(this,SWT.NONE);
        btnAzLicht.setBounds(10,10,150,35);
        btnAzLicht.setText("AZ Licht");     
    }

    @Override
    protected void checkSubclass() {}
}

我还有其他几个组合,喜欢根据需要加载它们。问题是,我不知道如何卸载它们。在这里,我加载了三个菜单,它们从窗口的左上角开始添加。如果我只是重绘窗口(不第二次加载复合材料),它们会继续显示,处理它们没有成功。我可以将它们设置为不可见,但是如果我再加载一个,它的位置不是不可见的位置,而是添加到下一个空闲位置。设置边界也没有帮助,我没有找到将它们设置为窗口指定坐标的方法,并且总是只设置其中一个可见。

解决方法

首先不要尝试将布局与 setBounds 混合使用,这是行不通的。布局会覆盖您使用的任何边界。

有几种方法可以做到这一点。可能最灵活的是使用 GridLayout,它支持从布局中排除控件。

在本例中,我使用的是您的 menu 类的这个版本(重命名为 MyMenu - 请遵循 Java 编码约定,类名以大写字母开头):

public class MyMenu extends Composite
{
  public MyMenu(final Composite parent,final String text)
  {
    super(parent,SWT.NONE);

    setLayout(new FillLayout());

    Button btnAzLicht = new Button(this,SWT.NONE);
    btnAzLicht.setText(text);
  }

  @Override
  protected void checkSubclass()
  {
  }
}

设置仅显示 myMenu1 的 Shell 的代码是:

shell.setLayout(new GridLayout());

MyMenu myMenu1 = new MyMenu(shell,"Text 1");
myMenu2.setVisible(true);

GridData data1 = new GridData(SWT.BEGINNING,SWT.CENTER,false,false);
data1.exclude = false;
myMenu1.setLayoutData(data1);

MyMenu myMenu2 = new MyMenu(shell,"Text 2");
myMenu2.setVisible(false);

GridData data2 = new GridData(SWT.BEGINNING,false);
data2.exclude = true;
myMenu2.setLayoutData(data1);

MyMenu myMenu3 = new MyMenu(shell,"Text 3");
myMenu3.setVisible(false);

GridData data3 = new GridData(SWT.BEGINNING,false);
data3.exclude = true;
myMenu3.setLayoutData(data1);

myMenu2myMenu3 控件设置为不可见并从布局中排除。

要使 menu2 显示,您可以执行以下操作:

myMenu1.setVisible(false);
data1.exclude = true;

myMenu2.setVisible(true);
data2.exclude = false;

shell.layout();

更改可见和排除设置,然后调用 layout 以重新计算布局。