WindowBuilder:在应用程序内切换 Composite window
WindowBuilder: switching Composite within an application window
我有一个应用程序 window,我想根据不同的情况在其中显示不同的组件。
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() {}
}
我还有其他几个组合,喜欢根据需要加载它们。问题是,我不知道如何卸载它们。在这里,我加载了三个菜单,它们从 window 的左上角开始添加。如果我只是重绘 window(不第二次加载复合材料),它们会继续显示,处理它们不会成功。我可以将它们设置为不可见,但是如果我加载另一个,它的位置不是不可见的位置,而是添加到下一个空闲位置。设置边界也没有帮助,我没有找到一种方法将它们设置为 window 的指定坐标,并且总是只设置其中一个可见。
首先不要尝试将布局与 setBounds 混合使用,否则不会起作用。布局覆盖您使用的任何边界。
有几种方法可以做到这一点。可能最灵活的方法是使用支持从布局中排除控件的 GridLayout
。
对于此示例,我使用的是您的 menu
class 版本(已重命名为 MyMenu
- 请遵循 Java 编码约定,class名称以大写字母开头):
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()
{
}
}
设置 Shell 且仅显示 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
重新计算布局。
我有一个应用程序 window,我想根据不同的情况在其中显示不同的组件。
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() {}
}
我还有其他几个组合,喜欢根据需要加载它们。问题是,我不知道如何卸载它们。在这里,我加载了三个菜单,它们从 window 的左上角开始添加。如果我只是重绘 window(不第二次加载复合材料),它们会继续显示,处理它们不会成功。我可以将它们设置为不可见,但是如果我加载另一个,它的位置不是不可见的位置,而是添加到下一个空闲位置。设置边界也没有帮助,我没有找到一种方法将它们设置为 window 的指定坐标,并且总是只设置其中一个可见。
首先不要尝试将布局与 setBounds 混合使用,否则不会起作用。布局覆盖您使用的任何边界。
有几种方法可以做到这一点。可能最灵活的方法是使用支持从布局中排除控件的 GridLayout
。
对于此示例,我使用的是您的 menu
class 版本(已重命名为 MyMenu
- 请遵循 Java 编码约定,class名称以大写字母开头):
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()
{
}
}
设置 Shell 且仅显示 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
重新计算布局。