60 votes

Suppression du bouton "X" dans le JDialog Swing

Existe-t-il un moyen de supprimer le bouton de fermeture ("X") de l'écran d'accueil de l'entreprise ? JDialog barre de titre ?

7 votes

J'ai vu certaines applications qui affichent une autre boîte de dialogue si vous appuyez sur le bouton de fermeture, vous invitant à appuyer sur l'un des autres boutons à la place. Génial !

0 votes

@TomHawtin-tackline La seule chose dont vous auriez besoin pour faire cela serait d'ajouter un écouteur d'événements à l'interface de l'utilisateur. JDialog lorsqu'elle est fermée, puis afficher une nouvelle JDialog (soit en étendant le JDialog ou en utilisant la classe JOptionPane ) pour indiquer à l'utilisateur les boutons sur lesquels il doit appuyer. Cette boîte de dialogue devrait également avoir seulement un OK bouton.

60voto

Huxi Points 2629

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

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 y ait un moyen d'enlever les X complètement.

13voto

thedude19 Points 1259

Je crois que vous pouvez appeler dialog.setUndecorated(true) pour supprimer la barre de titre. Je ne suis pas sûr que le 'X' soit suffisant.

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

La meilleure solution consiste à contrôler ce qui se passe lorsque l'utilisateur clique sur le "X" en utilisant la fonction dialog.setDefaultCloseOperation ou un WindowListener .

0 votes

Merci de parler de WindowListener ; ce sera une bonne chose pour les personnes qui veulent un son d'avertissement lorsque l'utilisateur tente de fermer la boîte de dialogue.

10voto

Supuhstar Points 2310

Depuis Java 1.7 (alias 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 le bouton d'agrandissement avec frame.setResizable(false) et vous pouvez supprimer les boutons de minimisation et d'agrandissement en utilisant une balise java.awt.Dialog ou une classe qui l'étend, telle que javax.swing.JDialog . Vous pouvez supprimer la barre de titre, les bordures et les boutons à l'aide de la fonction frame.setUndecorated(true) et vous pouvez contrôler entièrement la visibilité de tous les boutons de la barre de titre (tout en perdant une partie de la compatibilité multiplateforme et de l'intégration du système d'exploitation) avec frame.setDefaultLookAndFeelDecorated(true) (en supposant que c'est un JFrame ou un JDialog). C'est tout le contrôle que je vois possible avec le JDK actuel.

4 votes

C'est "ne pas réparer" sur parade des insectes .

0 votes

Ce n'est pas tout à fait correct. Le fait de sous-classer / instancier un JDialog sous OS X (testé sur El Capitan) ne supprime aucun bouton de la barre de titre, ni aucune combinaison de paramètres (et oui, j'ai essayé toutes les combinaisons). Seul setUndecorated(true) les supprime tous, mais la barre de titre disparaît avec elle. Vous pouvez certainement modifier le comportement des boutons de la barre de titre, mais pour ce qui est de l'apparence... c'est une situation très délicate sur laquelle j'ai passé trop de temps avec des solutions insatisfaisantes et un code non portable.

0 votes

@EntangledLoops Merci pour votre commentaire ! Bien qu'il soit vrai que JDialog ne fait pas supprimer les boutons "minimiser" et "maximiser" des boîtes de dialogue OS X, il désactive le bouton "minimiser". Je n'ai pas de Mac sous la main pour tester cela, mais je suis prêt à parier que le bouton "maximize" ne fait que redimensionner la boîte de dialogue, et que si vous définissez le paramètre dialog.setResizable(false) le bouton vert sera lui aussi désactivé ! Quoi qu'il en soit, comme je l'ai dit dans ma réponse, il est regrettable que nous n'ayons pas un contrôle total sur ce point, mais je peux imaginer à quel point cela peut être un cauchemar pour les créateurs de JSE de programmer pour toutes les plateformes ;3

1voto

À vue de nez, définissez-le comme étant décoré par PL&F et supprimez le composant par son nom.

1 votes

Qu'est-ce que PL&F ? Merci.

0 votes

PL&F est Pluggable Look & Feel. C'est la façon laide dont Swing peut prendre un Look & Feel arbitraire.

-3voto

krzydyn Points 1
static public void removeButtons(Component c){
    if (c instanceof AbstractButton){
        String accn = c.getAccessibleContext().getAccessibleName();
        Container p=c.getParent();
        //log.debug("remove button %s from %s",accn,p.getClass().getName());
        c.getParent().remove(c);
    }
    else if (c instanceof Container){
        //log.debug("processing components of %s",c.getClass().getName());
        Component[] comps = ((Container)c).getComponents();
        for(int i = 0; i<comps.length; ++i)
            removeButtons(comps[i]);
    }
}

8 votes

Cela supprimera tous les boutons ajoutés à la boîte de dialogue, mais pas les boutons de fermeture de la boîte de dialogue.

1 votes

Cela n'a aucun effet sur les boutons de la barre de titre (OS X).

2 votes

C'est en fait assez amusant et laisse votre application dans un état hilarant et inutilisable si vous jamais utiliser les boutons x3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X