2017-05-16 2 views
0

Comment puis-je définir du texte sur JTextField lorsque je clique sur le composant? Chaque fois que je clique dessus, il effacera le texte comme celui-ci:Comment définirText à JTextField lorsque vous cliquez en dehors de celui-ci?

// Clears the "Enter text here..." when clicked 
    commandLine.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      commandLine.setText(""); 
     } 
    }); 

Mais, quand je clique hors du champ de texte, comment puis-je le réinitialiser? J'ai essayé FocusEvent mais ça n'a pas marché comme je le voulais.

+0

Essayez-vous de mettre en œuvre un espace réservé? – Ollaw

+0

Je ne sais pas ce que cela signifie vraiment, j'essaie d'avoir un JTextField où est écrit "Entrez un message ici ..." déjà écrit, mais quand vous cliquez sur le JTextField, le message disparaîtra. Après avoir cliqué, le même message sera de nouveau là. – Timppa

+0

Ok c'est un espace réservé. Si vous entrez du texte, le texte d'exemple doit-il rester? – Ollaw

Répondre

1

Je pense que vous avez juste besoin d'ajouter un FocusListener au textField. Ici, il y a une classe que j'ai écrite qui fonctionne comme vous voulez.

class CustomPlaceholderTextField extends JTextField implements FocusListener { 

private static final long serialVersionUID = 1L; 
private boolean changedText = false; 
private final String placeholder; 


public CustomPlaceholderTextField(String placeholder){ 
    super(); 
    this.placeholder = Objects.requireNonNull(placeholder); 
    this.addFocusListener(this); 
    super.setText(placeholder); 

} 

@Override 
public String getText() { 
    if (this.changedText) { 
     return super.getText(); 
    } else { 
     return ""; 
    } 
} 

@Override 
public void setText(String t) { 
    if (t == null || t.isEmpty()) { 
     super.setText(this.placeholder); 
     this.changedText = false; 
    } else { 
     super.setText(t); 
     this.changedText = true; 
    } 
} 

@Override 
public void focusGained(FocusEvent e) { 
    if (!this.changedText) { 
     super.setText(""); 
     this.changedText = true; 
    } 
} 

@Override 
public void focusLost(FocusEvent e) { 
    if (this.getText().isEmpty()) { 
     super.setText(this.placeholder); 
     this.changedText = false; 
    } else { 
     this.changedText = true; 
    } 
} 

}

+0

Cela semble cool, est-il un moyen d'ajouter comme commandLine.FocusEvent? comme ça je n'ai pas besoin de créer une classe différente, juste une petite méthode? – Timppa

+0

Et le problème est que j'ai créé mon GUi avec WindowBuilder (dans NetBeans) donc je ne peux pas vraiment éditer ce script à moins d'aller dans les propriétés et de le modifier, donc j'utilise plutôt une méthode pour ça. – Timppa

+0

Ajoutez juste un FocusListener à votre textField et implémentez focusGained() et focusLost() comme vous voulez, comme je l'ai fait – Ollaw