在SWT中堆叠模态对话框

时间:2015-11-30 12:05:39

标签: java macos swt

我在纯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的错误还是我的代码中的问题?我无法弄清楚原因。

0 个答案:

没有答案