Pregunta

Pregunta simple:

¿Puede un marco oscilante ser completamente modal (bloquear todas las demás ventanas)?

Intenté lo siguiente, pero aún puedo hacer clic en otras ventanas de aplicaciones (como este navegador)

JDialog myDialog  = .... 
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

Por favor, pegue un código si es posible.

¿Fue útil?

Solución

JFrame no está diseñado para ser modal. Use JDialog para ello, pero perderá algunas funciones de JFrame al hacerlo. Si no puede vivir con la pérdida, debe bloquear EventQueue y reemplazarla por la suya para aceptar solo eventos del bloqueador.

Consulte Creación de marcos internos modales para obtener una explicación utilizando marcos internos eso también debería ser aplicable a JFrame.

Editar: Oups, mi respuesta parece un poco incorrecta, ya que su ejemplo de código muestra que ya está usando una subclase de diálogo para esto.

Otros consejos

Los diálogos no están destinados a ser globalmente modales. Todos los sistemas operativos modernos desalientan la modalidad global en su HIG, e incluso pueden haber desaprobado la funcionalidad (como lo indica el hecho de que no puede hacer que funcione). Su aplicación debe nunca robar eventos de todo el sistema; eso no es solo un mal diseño, es casi criminal en mi libro.

Sin tener en cuenta el hecho de que a la mayoría de las personas les gusta realizar tareas múltiples entre varias aplicaciones, ¿qué pasa con el escenario en el que abre un diálogo modal global y luego su aplicación se congela? Ctrl + Alt + Supr debería funcionar en Windows para eliminar la aplicación, pero no estoy seguro acerca de Cmd + Opt + Escape en Mac con un diálogo global modal (¿Cocoa incluso tiene modalidad global?). Ninguna de las plataformas de Linux tiene una forma agradable de eliminar las aplicaciones que han asumido el control completo de la interfaz de usuario como usted sugiere (tendría que eliminar X11 por completo y comenzar una nueva instancia desde cero).

Mi respuesta: encuentre otra forma. No me importa lo que su cliente esté pidiendo, no quieren esto.

No sé sobre modal global, pero aquí hay una idea.

  1. Tome la captura de pantalla del escritorio.
  2. Ir a pantalla completa.
  3. Pop up su diálogo.

Dado que el escritorio es una captura de pantalla falsa, puede ignorar cualquier intento de hacer clic en él.

Muestra de pantalla completa :

private void toggleFullScreenWindow() {
  GraphicsEnvironment graphicsEnvironment
    = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice graphicsDevice
    = graphicsEnvironment.getDefaultScreenDevice();
  if(graphicsDevice.getFullScreenWindow()==null) {
    dialog.dispose(); //destroy the native resources
    dialog.setUndecorated(true);
    dialog.setVisible(true); //rebuilding the native resources
    graphicsDevice.setFullScreenWindow(dialog);
  }else{
    graphicsDevice.setFullScreenWindow(null);
    dialog.dispose();
    dialog.setUndecorated(false);
    dialog.setVisible(true);
    dialog.repaint();
  }
  requestFocusInWindow();
}

FYI: API de modo exclusivo de pantalla completa .

scroll top