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.
Réponses
Trop de publicités?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.
Vous pouvez utiliser le Composant JLayer :
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.
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.
- Réponses précédentes
- Plus de réponses