4 votes

Comment mettre en noir un composant Swing ?

J'ai un besoin où, sous certaines conditions, je dois faire disparaître le composant swing (champ texte) en conservant sa valeur de chaîne de caractères.

4voto

goldilocks Points 6181

Il y a JPasswordField Il s'agit d'un champ de texte que l'on peut faire basculer pour qu'il affiche * * (ou un autre caractère d'écho) à la place du contenu réel. C'est probablement la méthode la plus simple.

Si cela ne suffit pas, vous pouvez extraire le contenu et le stocker à l'extérieur, dans un espace vide ou blanc, quel que soit le domaine, et setEnabled(false) sur elle. Lorsque vous réactivez le champ, remettez le contenu en place. S'il est nécessaire d'utiliser getText() entre-temps, vous devrez passer outre afin de pouvoir remplacer le contenu stocké le cas échéant.

3voto

Garrett Hall Points 11902

Pour rendre tout le texte noir, appelez

textfield.setForeground(new Color(0,0,0,0))
textfield.setBackground(Color.BLACK)
textfield.setOpaque(true)

pour les empêcher de sélectionner l'appel de texte

textfield.setFocusable(false)

3voto

Rekin Points 3100

Vous pouvez utiliser le Composant JLayer :

An example of gradient in front of JPanel

2voto

dflemstr Points 18999

Vous devez masquer le champ de texte en utilisant .setVisible(false) et le remplacer par un autre composant de couleur noire (par exemple un JLabel avec un fond noir). Pour ce faire, il suffit de placer les deux composants (l'étiquette et le champ de texte) dans un fichier de type JPanel et les empiler les uns sur les autres. Vous pouvez éventuellement masquer le champ de texte, si vous n'avez pas besoin d'une zone noire à la place.

Il existe d'autres méthodes pour effectuer cette opération en utilisant uniquement le champ de texte, mais aucune d'entre elles n'est infaillible, car les systèmes d'exploitation rendent les composants Swing différemment (en particulier Mac OS X). paint() ou la modification de la couleur du texte (comme décrit par @GarrettHall) ne fonctionnerait pas toujours, par exemple.

2voto

Durandal Points 9434

La méthode la plus simple consiste probablement à retirer le composant de son conteneur et à le remplacer par un composant fictif du même type. Cela pourrait être joliment encapsulé en créant votre propre composant qui encapsule l'échange des composants (squelette) :

public class BlackOutTextField extends JPanel {

    private final JTextField realField = new JTextField();
    private final JTextField dummyField = new JTextField();
    private boolean isBlackedOut;

    {
        dummyField.setEditable(false);
        setLayout(new BorderLayout());
        add(realField, BorderLayout.CENTER);
    }

    public String getText() {
        return isBlackedOut ? "" : realField.getText();
    }

    public void setText(final String text) {
        if (!isBlackedOut)
            realField.setText(text);
    }

    public void setBlackedOut(final boolean blackedOut) {
         if (this.isBlackedOut != blackedOut) {
             this.isBlackedOut = blackedOut;
             removeAll();
             add(this.isBlackedOut ? dummyField : realField, BorderLayout.CENTER);
             revalidate();
         }
    }
}

Vous voyez ce que je veux dire.

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