2010-12-06 20 views

答えて

21

アプリケーション全体をブロックするためには、あなたは、スタイルSWT.APPLICATION_MODALとの対話Shellを作成し、それを開き、シェルが配置されるまで、UIイベントを送り出すことができます。

Display display = Display.getDefault(); 
Shell dialogShell = new Shell(display, SWT.APPLICATION_MODAL); 
// populate dialogShell 
dialogShell.open(); 
while (!dialogShell.isDisposed()) { 
    if (!display.readAndDispatch()) { 
     display.sleep(); 
    } 
} 

ブロックしたい場合親にのみ入力する場合は、スタイルSWT.PRIMARY_MODALを使用してみてください。ただし、Javadocは(他のモーダルスタイルの場合は)これがヒントであることを指定しています。すなわち、異なるSWT実装が同じように正確にそれを処理しないことがある。同様に、SWT.SYSTEM_MODALスタイルを尊重する実装についてはわかりません。


UPDATE:あなたが同時に開いて2個の以上の一次モーダルを持っている場合、あなたは彼らのように、モーダルが閉じられるまでのイベントをポンプするためにトリックを使用することはできません最初のコメントに

回答任意の順序で閉じることができます。コードは実行されますが、現在のダイアログが閉じられた後のwhileループの後に実行が再開されますとその後に開いたダイアログはすべてです。この場合、閉じたときにコールバックを取得するために、各ダイアログにDisposeListenerを登録します。このようなもの:

void run() { 
    Display display = new Display(); 
    Shell shell1 = openDocumentShell(display); 
    Shell shell2 = openDocumentShell(display); 

    // close both shells to exit 
    while (!shell1.isDisposed() || !shell2.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 
} 

Shell openDocumentShell(final Display display) { 
    final Shell shell = new Shell(display, SWT.SHELL_TRIM); 
    shell.setLayout(new FillLayout()); 
    Button button = new Button(shell, SWT.PUSH); 
    button.setText("Open Modal Dialog"); 
    button.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      System.out.println("Button pressed, about to open modal dialog"); 
      final Shell dialogShell = new Shell(shell, SWT.PRIMARY_MODAL | SWT.SHEET); 
      dialogShell.setLayout(new FillLayout()); 
      Button closeButton = new Button(dialogShell, SWT.PUSH); 
      closeButton.setText("Close"); 
      closeButton.addSelectionListener(new SelectionAdapter() { 
       @Override 
       public void widgetSelected(SelectionEvent e) { 
        dialogShell.dispose(); 
       } 
      }); 
      dialogShell.setDefaultButton(closeButton); 
      dialogShell.addDisposeListener(new DisposeListener() { 
       @Override 
       public void widgetDisposed(DisposeEvent e) { 
        System.out.println("Modal dialog closed"); 
       } 
      }); 
      dialogShell.pack(); 
      dialogShell.open(); 
     } 
    }); 
    shell.pack(); 
    shell.open(); 
    return shell; 
} 
+0

ありがとうございます。 2つの異なるシェルで 'SWT.PRIMARY_MODAL'-dialogを使用する場合、どのようにイベントループがどのように表示され、ダイアログは他のシェルをブロックしませんか?たぶん、各シェルに2つのシェルと1つの親モーダルダイアログを表示した完全な作業サンプルを提供できますか?前もって感謝します。 – Mot

+2

(ところで、SWT.SHEETスタイルは、これらのPRIMARY_MODALダイアログに特に適しています。Mac OS Xでは、ダイアログが親のタイトルバーから出てくるように見え、親に目に見える形で表示されますそれは親とのUIインタラクションをブロックしていますが、他のプラットフォームで何が起こるかはわかりません...) –

関連する問題