Bonjour,
J'aimerais savoir si c'est possible de creer un thread qui permet de voir si un JTextField et vide ou non.
Merci d'avance![]()
Bonjour,
J'aimerais savoir si c'est possible de creer un thread qui permet de voir si un JTextField et vide ou non.
Merci d'avance![]()
Pourquoi faire compliqué quand on peut faire simple ? Mets un DocumentListener sur ton JTextField :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DocumentListener myListener = new DocumentListener() {....}; JTextField myTextField = new JTextField(); myTextField.getDocument().addDocumentListener(myListener);
J'ai réussi à le faire avec un thread ma ta solution me semble etre beaucoup plus simple.
Quand je la met en place ca me met une erreur : Cant find symbol DocumentListener
J ai regardé un peu sur la javadoc mais j'ai pas trop compris, en fait ca execute le code entre les accolade si le JTextField est modifié, c'est ca?
Effectivement, c'est fait pour ça.J'ai réussi à le faire avec un thread ma ta solution me semble etre beaucoup plus simple.
import javax.swing.event.DocumentListenerQuand je la met en place ca me met une erreur : Cant find symbol DocumentListener
DocumentListener est une interface, tu dois l'implémenter (code entre les accolades), c-à-d. définir les trois méthodes :J ai regardé un peu sur la javadoc mais j'ai pas trop compris, en fait ca execute le code entre les accolade si le JTextField est modifié, c'est ca?
Si du texte est inséré, la méthode insertUpdate est appelée, si du texte est supprimé, la méthode removeUpdate est appelée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public void insertUpdate(DocumentEvent e); public void removeUpdate(DocumentEvent e); public void changedUpdate(DocumentEvent e);
Donc si k'ai bien compris je dois faire ca:
class CLASS extends JFrame implements DocumentListener{
...
...
..
public CLASS (String titre){
...
...
DocumentListener myListener = new DocumentListener() {
public void insertUpdate(DocumentEvent e);
public void removeUpdate(DocumentEvent e);
public void changedUpdate(DocumentEvent e);
};
code.getDocument().addDocumentListener(myListener);
}
public void insertUpdate(DocumentEvent e){
//là je met ce que je veux que ca fasse
}
public void removeUpdate(DocumentEvent e){
//là je met ce que je veux que ca fasse
}
public void changedUpdate(DocumentEvent e){
//là je met ce que je veux que ca fasse
}
}
"Code", c'est un JTextField,j avais oublié
Mais ca me met encore plein d'erreurs, j ai pas du faire ce qu il fallait.
Plutôt qq chose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class Fenetre extends JFrame implements DocumentListener { public Fenetre(String titre) { ... code.getDocument().addDocumentListener(this); } public void insertUpdate(DocumentEvent e){ //là je met ce que je veux que ca fasse } public void removeUpdate(DocumentEvent e){ //là je met ce que je veux que ca fasse } public void changedUpdate(DocumentEvent e){ //là je met ce que je veux que ca fasse } }
oki ca marche mais le seul probleme c'est que les methodes, par exemple insertUdapte, fonctionne caractere par caractere, c'est à dire que si je rentre "test", ca va faire 4 fois la methode.
En tout cas merci de ton aide déjà![]()
C'est bon j'ai trouvé un moyen.
Vu que dans mon JText, ca va etre un code barre et que les codes barres contiennent exclusivement 13 caracteres, dans le Insert,je verifie le nombre de caractere avant de lancer quelquechose.
Big merci et Bonne Année en avance![]()
Me revoilà, j 'ai un autre probleme que je post ici car ca doit avoir un rapport avec ce que j'ai fait avant.
La methode setText(null) me renvoie une erreur dans ma boite cmd.
code:
public void insertUpdate(DocumentEvent e){
cara = (code.getText()).length(); //code=JTextField
if(cara==13){
Fiche_Code fiche = new Fiche_Code("Fiche",code.getText());
code.setText(null);//c'est là que ca marche pas
}
}
Donc aucun prob à la compilation mais à l'execution.....:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt
to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:134
3)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:662)
at javax.swing.text.JTextComponent.setText(JTextComponent.java:1441)
at player_game.insertUpdate(player_game.java:115)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.j
ava:184)
ps: je n ai pas tout mis.
Merci d'avance![]()
Tu n'as pas le droit de modifier le Document source de l'événement dans les méthodes de notification, c'est ce qui se passe avec :
Dans ce cas, le DocumentListener n'est pas forcément la meilleure solution... Soit tu crées une nouvelle classe héritée de PlainDocument et redéfinis la méthode insertString (éventuellement remove), soit tu fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part code.setText(null);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if (cara == 13) { Fiche_Code fiche = new Fiche_Code("Fiche", code.getText()); SwingUtilities.invokeLater(new Runnable() { public void run() { code.setText(null); } }); }
Bon bah voilà ca marche parfaitement ta deuxieme solution
Mais peux tu m'expliquer pourquoi stp?
Je suis pas trop calé en java, ca ressemble un peu à un thread nan?(methode run).
La méthode invokeLater() sert à différer un traitement une fois que tous les événements de la file d'attente EventQueue sont traités. Cette file maintient les événements souris, clavier, paint, ... en interaction avec l'IHM. L'événement fourni à invokeLater (en fait, un Runnable) est inséré en queue de file. Le thread en charge d'exécuter les événements de l'EventQueue (appelé Event Dispatch Thread) appelle simplement la méthode run() du Runnable fourni.
Partager