2012-05-22 1 views
4

Salut avoir une exigence où, à certaines conditions, je dois noircir le composant swing (champ de texte) en préservant sa valeur de chaîne. c'est-à-dire que le composant ne doit pas montrer quelle valeur de chaîne il contient.Comment noircir un composant Swing?

+1

et quelle a été votre tentative? –

+0

pas encore trouvé, a essayé de le rendre invisible mais je veux que le fichier soit présent mais ne montre pas les données. – GuruKulki

Répondre

3

Pour faire texte intégral appel noir

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

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

textfield.setFocusable(false) 
+1

Bien qu'une bonne suggestion, mais pourquoi ne pas l'utiliser, 'textField.setForeground (textField.getBackground());', cela sera fait sans maux de tête :-) –

+0

Le texte est visible avec ceci. Je ne veux pas montrer le texte. – GuruKulki

+0

@GuruKulki et Garrett: Pensez également à définir la propriété focusable du champ de texte sur 'false' quand vous le faites également. Sinon, le texte s'affichera lorsque le champ aura le focus et que le texte sera sélectionné. 1+ vote pour votre bonne réponse. –

2

Vous devez masquer le champ de texte à l'aide .setVisible(false), et le remplacer par un autre composant qui est noir (par exemple un JLabel avec un fond noir). Cela peut être fait en mettant les deux composants (l'étiquette et le champ de texte) dans un JPanel dédié, les empilant les uns sur les autres. Vous pouvez éventuellement simplement masquer le champ de texte, si vous n'avez pas besoin d'une zone noire à la place. Il existe d'autres méthodes pour ce faire impliquant uniquement le champ de texte, mais aucune n'est infaillible, car différents systèmes d'exploitation rendront les composants Swing différemment (en particulier Mac OS X), remplaçant ainsi la méthode paint() du champ de texte. ou changer la couleur du texte (comme décrit par @ GarrettHall) ne fonctionnerait pas toujours, par exemple.

4

Il existe JPasswordField, qui est un champ de texte qui peut être activé pour afficher * * (ou un autre caractère d'écho) au lieu du contenu réel. C'est probablement le moyen le plus facile.

Si cela ne suffit pas, vous pouvez extraire le contenu et le stocker à l'extérieur, en blanc ou en buvard ou quel que soit le champ et setEnabled(false) dessus. Lorsque vous activez à nouveau le champ, remettez le contenu. S'il est nécessaire d'utiliser getText() entre-temps, vous devrez le remplacer pour pouvoir remplacer le contenu stocké si nécessaire.

1

J'ai fait un petit exemple qui fait que les caractères noirs et la zone de texte trop noir, en utilisant seulement JTextField, que vous avez demandé.

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class RunnableTest{  
    public static void main(String args[]){ 

     JFrame frame = new JFrame("frame"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     JTextField textfield = new JTextField(); 
     textfield.setPreferredSize(new Dimension(400,30)); 
     textfield.setForeground(Color.black); 
     textfield.setBackground(Color.black); 
     textfield.setSelectedTextColor(Color.black); 
     textfield.setSelectionColor(Color.black); 

     frame.getContentPane().add(panel); 
     panel.add(textfield); 
     frame.pack(); 

     frame.setVisible(true);  
    } 
} 

cette méthode textfield.setForeground(Color.black); définit la police au noir, et textfield.setBackground(Color.black); cette autre méthode définit l'arrière-plan noir.

textfield.setSelectedTextColor(Color.black); 
textfield.setSelectionColor(Color.black); 

définit la sélection noire afin que vous ne puissiez pas voir ce qui a été sélectionné.

Bien sûr, vous pouvez utiliser le champ de mot de passe comme une alternative, si vous ne voulez pas utiliser JTextField et empêcher l'utilisateur de copier le texte.

EDIT: si vous ne voulez pas que l'utilisateur copie du texte en utilisant CTRL + C, ajoutez un keyadapter au champ de texte pour que vous sachiez quand l'utilisateur a appuyé sur les deux touches au même moment. bien sûr, il y a beaucoup d'autres combinaisons sur d'autres systèmes, mais ce n'est pas la question.

+0

Vous pouvez toujours CTRL-C le texte :) – Durandal

+0

Bien sûr que vous pouvez, c'est un JTextField. et l'utilisateur n'a pas précisé que vous n'aviez pas à le faire. il ne montre pas la valeur. –

+1

Ahha, c'est incroyable, j'ai presque oublié de paramétrer, 'SelectionColours' en commentant, +1, pour cette belle addition :-), bien que ce soit déclaré par @Durandal, cela ne donne qu'une seule option 'JPasswordField' :-) –

2

Probablement la meilleure façon de le faire serait de supprimer le composant de son contenant et le remplacer par un élément fictif du même type. Cela pourrait être bien encapsulé en créant votre propre composant qui encapsule la permutation 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 avez l'idée.