2010-12-06 14 views
10

AWT/Swing permite mostrar los cuadros de diálogo de la aplicación modal (bloqueo de toda la aplicación) y modal modal (bloqueando solo los padres). ¿Cómo puedo lograr lo mismo con SWT?Mostrar diálogo modal principal con SWT

Respuesta

21

Con el fin de bloquear toda la aplicación, puede crear el cuadro de diálogo Shell con el estilo SWT.APPLICATION_MODAL, abrirlo, y luego bombear los eventos de interfaz de usuario hasta que la carcasa está dispuesto:

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 desea bloquear entrada solo para el padre, intente usar el estilo SWT.PRIMARY_MODAL, aunque los Javadocs especifican (como para los otros estilos modales) que esto es una pista; es decir, que diferentes implementaciones de SWT pueden no manejarlo exactamente de la misma manera. Del mismo modo, no sé de una implementación que honre el estilo SWT.SYSTEM_MODAL.


ACTUALIZACIÓN: Respuesta a la primera observación

Si tiene dos o más modales primarias abiertas al mismo tiempo, no se pueden utilizar los trucos para bombear los eventos hasta que el modal se cerró, ya que podría cerrarse en cualquier orden El código se ejecutará, pero la ejecución se reanudará después del ciclo while después de que se cierre el cuadro de diálogo actual y todos los demás cuadros de diálogo que se hayan abierto después de. En este caso, registraría un DisposeListener en cada diálogo para obtener una devolución de llamada cuando estén cerrados. Algo como esto:

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

Gracias por responder. Al usar diálogos 'SWT.PRIMARY_MODAL' en dos shells diferentes, ¿cómo deberían verse los bucles de eventos para que los diálogos no bloqueen el otro? ¿Tal vez pueda proporcionar una muestra de trabajo completa mostrando dos proyectiles con un cuadro de diálogo modal principal en cada caparazón? Gracias por adelantado. – Mot

+2

(Por cierto, el estilo SWT.SHEET es especialmente apropiado para estos cuadros de diálogo PRIMARY_MODAL. En Mac OS X, hacen que el cuadro de diálogo parezca salir de la barra de título del elemento primario y está visiblemente unido al elemento principal, lo que indica claramente está bloqueando la interacción de UI con su padre solamente. Sin embargo, no sé qué sucede en otras plataformas ...) –

Cuestiones relacionadas