2010-12-06 7 views

Répondre

21

Afin de bloquer toute l'application, vous pouvez créer la Shell dialogue avec le style SWT.APPLICATION_MODAL, ouvrez-le, puis pomper les événements de l'interface utilisateur jusqu'à ce que la coquille est disposé:

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

Si vous voulez bloquer entrez uniquement le parent, essayez d'utiliser le style SWT.PRIMARY_MODAL, bien que les Javadocs spécifient (comme pour les autres styles modaux) qu'il s'agit d'un indice; c'est-à-dire que différentes implémentations de SWT peuvent ne pas le gérer exactement de la même manière. De même, je ne connais pas une implémentation qui honorerait le style SWT.SYSTEM_MODAL.


MISE À JOUR: Répondre à premier commentaire

Si vous avez deux ou plusieurs modaux primaires ouvertes en même temps, vous ne pouvez pas utiliser les astuces pour pomper les événements jusqu'à ce que le modal est fermé, car ils pourrait être fermé dans n'importe quel ordre. Le code sera exécuté, mais l'exécution reprendra après la boucle while après la fermeture de la boîte de dialogue en cours et toutes les autres boîtes de dialogue qui ont été ouvertes après elle. Dans ce cas, je voudrais enregistrer un DisposeListener sur chaque boîte de dialogue pour obtenir un rappel quand ils sont fermés. Quelque chose comme ceci:

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

Merci d'avoir répondu. Lorsque vous utilisez des dialogues 'SWT.PRIMARY_MODAL' sur deux shells différents, comment les boucles d'événements devraient ressembler pour que les dialogues ne bloquent pas l'autre? Peut-être que vous pouvez fournir un exemple de travail complet montrant deux coquilles avec un dialogue parent-modal dans chaque coquille? Merci d'avance. – Mot

+2

(En passant, le style SWT.SHEET est particulièrement approprié pour ces boîtes de dialogue PRIMARY_MODAL Sous Mac OS X, elles font apparaître la boîte de dialogue de la barre de titre du parent et sont visiblement attachées au parent, indiquant clairement il bloque l'interaction de l'interface utilisateur avec son parent uniquement, mais ne sait pas ce qui se passe sur les autres plateformes ...) –

Questions connexes