web-dev-qa-db-fra.com

Supprimer le bouton "X" dans Swing JDialog

Existe-t-il un moyen de supprimer le bouton de fermeture ("X") de la barre de titre JDialog?

58
richs

Vous pouvez supprimer l'intégralité du titre de la boîte de dialogue en appelant dialog.setUndecorated(true) mais cela signifie que la boîte de dialogue ne peut plus être déplacée.

Vous pouvez également exécuter dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE) pour éviter que le bouton ne fasse quoi que ce soit.

En plus de cela, je ne pense pas qu'il existe un moyen de supprimer complètement le X.

56
Huxi

Je crois que vous pouvez appeler dialog.setUndecorated(true) pour supprimer la barre de titre. Je ne suis pas sûr cependant du "X".

La suppression du "X" n'est peut-être pas une bonne idée, car vous souhaitez que vos utilisateurs puissent fermer facilement la boîte de dialogue.

Le meilleur pari est de contrôler ce qui se passe lorsque les utilisateurs cliquent sur le "X" en utilisant dialog.setDefaultCloseOperation ou WindowListener.

12
thedude19

À partir de Java 1.7 (AKA Dolphin ou Java 7), vous ne pouvez pas désactiver ou supprimer le bouton de fermeture d'une fenêtre. Vous pouvez supprimer/désactiver avec frame.setResizable(false) et vous pouvez supprimer les boutons de réduction et d'agrandissement en utilisant un Java.awt.Dialog ou une classe qui l'étend, comme javax.swing.JDialog. Vous pouvez supprimer la barre de titre, bordures et boutons avec frame.setUndecorated(true), et vous pouvez avoir un contrôle total sur la visibilité de tous les boutons dans la barre de titre (tout en perdant une compatibilité multiplateforme et une intégration du système d'exploitation) avec frame.setDefaultLookAndFeelDecorated(true) ( en supposant que c'est un JFrame ou JDialog). C'est tout le contrôle que je vois possible avec le JDK actuel.

9
Supuhstar

Voici mon expérience:

  • Essayé avec setUndecorated(true): a rendu l'ensemble Dialog invisible.
  • setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE): cela n'a pas du tout changé le comportement. Ma boîte de dialogue est toujours fermée. La définition de l'opération de fermeture par défaut sur DO_NOTHING_ON_CLOSE Délègue l'opération de fermeture à la méthode windowClosing() d'un WindowListener enregistré.

Ce qui a fonctionné pour moi, c'est:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//Remove any existing WindowListeners
for ( WindowListener wl : this.getWindowListeners())
        this.removeWindowListener(wl);
this.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
                 if ("Optional condition") {
                      JOptionPane.showMessageDialog(null, "You cannot close this window");
                 }
        }
});
4
Ryuu

À une supposition, définissez-le pour qu'il soit décoré PL&F et supprimez le composant par son nom.

1