Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WindowBuilder:在应用程序窗口内切换组合_Java_Eclipse_Swt_Windowbuilder - Fatal编程技术网

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

Java WindowBuilder:在应用程序窗口内切换组合,java,eclipse,swt,windowbuilder,Java,Eclipse,Swt,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

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

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() {}
}

我还有其他几种复合材料,喜欢根据需要加载它们。问题是,我不知道如何卸载它们。这里我加载了三个菜单,它们从窗口的左上角开始添加。如果我只是重新绘制窗口(不再加载复合材料),它们会继续显示,那么处理它们不会成功。我可以将它们设置为不可见,但如果我加载另一个,它的位置不是不可见的位置,而是添加到下一个自由位置。设置边界也无济于事,我也没有找到方法将它们设置为窗口的指定坐标,并且始终只设置其中一个可见。

首先不要尝试将布局与设置边界混合使用,否则将无法工作。布局覆盖您使用的任何边界

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

在本例中,我使用的是
菜单
类的这个版本(重命名为
MyMenu
——请遵循Java编码惯例,类名以大写字母开头):

设置外壳的代码仅显示
myMenu1

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, SWT.CENTER, false, false);
data2.exclude = true;
myMenu2.setLayoutData(data1);

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

GridData data3 = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
data3.exclude = true;
myMenu3.setLayoutData(data1);
myMenu2
myMenu3
控件设置为不可见,并从布局中排除

要制作menu2节目,请执行以下操作:

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

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

shell.layout();

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

必须更改一些名称,正如您所说的那样。问题是(我的问题不是很好:()原来的菜单有多个垂直的按钮,在我的初始设置中是170宽。当添加其他组合时,它们被放置在它的右边。菜单的宽度加上其他组合的宽度是窗口的宽度,都很好。现在更改布局后,窗口内的所有组合都具有相同的宽度:菜单太宽de,下面的下一个合成图。我现在可以在所有合成图中添加按钮、删除菜单、调整窗口宽度。或者有更好的方法吗?忘记上面的评论(以防您已经回答)。我可以移动合成图并在设计视图中管理它。效果非常好,非常感谢您的帮助!)
myMenu1.setVisible(false);
data1.exclude = true;

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

shell.layout();