Невозможно закрыть диалог - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь открыть диалог в SWT, где я переопределить метод createDialogArea для настройки моего диалога.В этом методе я пытаюсь открыть вопрос MessageDialog.Откройте это диалоговое окно. Если сообщение openQuestion вернет yes, в противном случае закройте диалоговое окно, прежде чем открывать его.Когда я нажимаю Отмена в диалоге OpenQuestion, я получаю исключение.

@Override
protected Control createDialogArea(Composite parent) {
    private boolean m_firstQuery = true;
    getShell().setText("Test");

    Composite composite = (Composite) super.createDialogArea(parent);
    composite.setLayout(new GridLayout(1, true));

    final Display display = Display.getCurrent();
    boolean moveOn = true;
    if (m_firstQuery) {
         moveOn = MessageDialog.openQuestion(display .getActiveShell(),
                "Do you want to open the dialog?", "Yes/No");
         if (!moveOn) {
             this.close();
         }

        m_firstQuery = false;
    }

    return composite;
}
java.lang.IllegalArgumentException: Argument not valid
 at org.eclipse.swt.SWT.error(SWT.java:4533)
 at org.eclipse.swt.SWT.error(SWT.java:4467)
 at org.eclipse.swt.SWT.error(SWT.java:4438)
 at org.eclipse.swt.widgets.Widget.error(Widget.java:448)
 at org.eclipse.swt.widgets.Widget.checkParent(Widget.java:285)
 at org.eclipse.swt.widgets.Widget.<init>(Widget.java:151)
 at org.eclipse.swt.widgets.Control.<init>(Control.java:110)
 at org.eclipse.swt.widgets.Scrollable.<init>(Scrollable.java:82)
 at org.eclipse.swt.widgets.Composite.<init>(Composite.java:96)
 at org.eclipse.jface.dialogs.Dialog.createButtonBar(Dialog.java:648)
 at org.eclipse.jface.dialogs.Dialog.createContents(Dialog.java:769)
 at org.eclipse.jface.window.Window.create(Window.java:426)
 at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1096)
 at org.eclipse.jface.window.Window.open(Window.java:783)

1 Ответ

0 голосов
/ 29 января 2019

Вы не можете вызвать close напрямую в createDialogArea, код диалога JFace ожидает, что диалоговое окно останется действительным на протяжении всего процесса создания диалога.

Вы можете использовать Display.asyncExec для задержкизакрыть, пока не откроется диалоговое окно.Замените this.close() на:

display.asyncExec(() -> close());

Однако было бы лучше отобразить окно сообщения, прежде чем пытаться создать диалоговое окно.

...