Question

Question simple:

Un cadre pivotant peut-il être complètement modal (bloquer toutes les autres fenêtres)?

J'ai essayé ce qui suit, mais je peux toujours cliquer sur d'autres fenêtres d'applications (comme ce navigateur)

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

Veuillez coller du code si cela est possible.

Était-ce utile?

La solution

JFrame n'est pas conçu pour être modal. Utilisez JDialog pour cela, mais vous perdrez certaines fonctionnalités de JFrame en le faisant. Si vous ne pouvez pas supporter la perte, vous devez bloquer EventQueue et le remplacer par le vôtre pour n'accepter que les événements de l'événement bloquant.

Voir Création de cadres internes modaux pour une explication à l'aide de cadres internes cela devrait également s'appliquer à JFrame.

Modifier: Oups, ma réponse semble un peu éteinte, car votre exemple de code montre que vous utilisez déjà une sous-classe Dialog pour cela.

Autres conseils

Les dialogues ne sont pas censés être globalement modaux. Tous les systèmes d’exploitation modernes découragent fortement la modalité globale dans son HIG, et ils ont peut-être même déconseillé la fonctionnalité (comme indiqué par le fait que vous ne pouvez pas la faire fonctionner). Votre application ne doit jamais voler des événements à l'ensemble du système; ce n'est pas seulement une mauvaise conception, c'est presque criminel dans mon livre.

Ignorant le fait que la plupart des utilisateurs préfèrent effectuer plusieurs tâches à la fois entre plusieurs applications, qu'en est-il du scénario dans lequel vous ouvrez une boîte de dialogue modale globale et que votre application se fige? Ctrl + Alt + Suppr devrait fonctionner sous Windows pour supprimer l'application, mais je ne suis pas sûr de Cmd + Opt + Escape sur Mac avec un dialogue modal global (Cocoa même a-t-il une modalité globale?). Aucune des plates-formes Linux ne permet de tuer les applications qui ont pris le contrôle total de l'interface utilisateur, comme vous le suggérez (vous devez tuer X11 complètement et démarrer une nouvelle instance à partir de zéro).

Ma réponse: trouver un autre moyen. Je me moque de ce que votre client demande, il ne le souhaite pas.

Je ne connais pas le modal global, mais voici une idée.

  1. Prenez la capture d'écran du bureau.
  2. Aller en plein écran.
  3. Ouvrez votre boîte de dialogue.

Le bureau étant une fausse capture d'écran, vous pouvez ignorer toute tentative de cliquer dessus.

Exemple d'écran complet :

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();
}

Pour info: API en mode exclusif plein écran .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top