AWT/Swing permet d'afficher les boîtes de dialogue modale d'application (bloquant toute l'application) et modale parente (ne bloquant que les parents). Comment puis-je obtenir la même chose avec SWT?Affichage de la boîte de dialogue modale parente avec SWT
Répondre
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;
}
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
(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 ...) –