我在纯SWT中堆叠对话框窗口时遇到问题 描述它有点复杂,但我尝试了:我有一个构建主应用程序窗口的入门类。在主窗口中,我通过单击按钮打开第一个模态对话框。从第一个对话框中,我再次打开第二个对话框,这是一个模态窗口。第二个对话框只包含一个标签而没有其他组件 用例是拥有主GUI和第一个对话框,用户可以在其中管理菜单快捷方式。为此目的,窗口包含例如具有现有快捷方式的dorpdown列表和用于改变所选快捷方式的按钮。通过单击此按钮,将打开第二个窗口,用户将提示您按下新键。
我的代码如下所示:
public class Runner {
public static void main(String[] args) {
Display display = new Display();
MainWindow app = new MainWindow(display);
app.open();
display.dispose();
}
}
public class MainWindow {
private Display display;
private Shell shell;
public MainWindow(Display display) {
this.display = display;
createContents();
}
public void open() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
private void createContents() {
shell = new Shell(display);
shell.setLayout(new FillLayout());
Button button = new Button(shell, SWT.PUSH);
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
showFirstWindow();
}
});
}
private void showFirstWindow() {
FirstWindow firstWindow = new FirstWindow(shell);
firstWindow.open();
}
}
public class FirstWindow extends Dialog {
private Display display;
private Shell shell;
public FirstWindow(Shell parent) {
super(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
display = parent.getDisplay();
createContents();
}
public void open() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
private void createContents() {
shell = new Shell(getParent(), getStyle());
shell.setLayout(new FillLayout());
Button button = new Button(shell, SWT.PUSH);
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
showSecondWindow();
}
});
}
private void showSecondWindow() {
SecondWindow secondWindow = new SecondWindow(shell);
secondWindow.open();
}
}
public class SecondWindow extends Dialog {
private Display display;
private Shell shell;
private Label label;
public SecondWindow(Shell parent) {
super(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
display = parent.getDisplay();
createContents();
}
public void open() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
private void createContents() {
shell = new Shell(getParent(), getStyle());
label = new Label(shell, SWT.NONE);
label.setLocation(10, 10);
label.setSize(200, 13);
label.setText("prompt text");
}
}
在Windows下,此构造工作正常,但在Mac OS X下,第二个对话框是不可见的。有趣的是,KeyPressedHandler被触发但是窗口以及提示消息未被显示 是不是可以在OS X中覆盖一些对话框,或者它是SWT的错误还是我的代码中的问题?我无法弄清楚原因。