Keypressed et champs en dur
Comment paramétrer le keypressed pour ne pas avoir des champs en dur?
Je voudrais enlever parent.champaffichage par un pointeur pour rendre cette fonction générique.
J'ai 4 champs "JTEXTFIELD" à contrôler.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| Avant_saisie = parent.champAffichage.getText();
public class Moteur_keypressedMS implements KeyListener{
CalculatriceMS parent; // une référence à la Calculatrice
String Avant_saisie;
boolean fnum = false;
Moteur_keypressedMS(CalculatriceMS parent) {
this.parent = parent;
}
public void keyPressed(KeyEvent event) {
System.out.println("Code touche pressée : " + event.getKeyCode() + " - caractère touche pressée : " + event.getKeyChar());
// jTextField.getText() contient le texte présent dans le JTextField avant l'appui sur la touche
// e.getKeyChar() est le caractère correspondant à la touche pressée
//JOptionPane.showConfirmDialog(null, "quelquechose c produit keyPressed","ici en haut", JOptionPane.PLAIN_MESSAGE);
char ch = event.getKeyChar();
if (ch == '0' ||ch == '1'||ch == '2' ||ch == '3' ||ch == '4' ||ch == '5' ||ch == '6' ||ch == '7' ||ch == '8' ||ch == '9' )
{fnum = true;} else { fnum = false; Avant_saisie = parent.champAffichage.getText(); }
pause();
}
public void keyReleased(KeyEvent event) {
System.out.println("Code touche relâchée : " + event.getKeyCode() + " - caractère touche relâchée : " + event.getKeyChar());
//JOptionPane.showConfirmDialog(null, "quelquechose c produit keyReleased","ici en haut", JOptionPane.PLAIN_MESSAGE);
if (!fnum) {parent.champAffichage.setText(Avant_saisie);}
pause();
}
public void keyTyped(KeyEvent event) {
System.out.println("Code touche tapée : " + event.getKeyCode() + " - caractère touche tapée : " + event.getKeyChar());
//JOptionPane.showConfirmDialog(null, "quelquechose c produit keyTyped","ici en haut", JOptionPane.PLAIN_MESSAGE);
if (!fnum) { parent.champAffichage.setText(Avant_saisie);}
pause();
}
private void pause(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} |
Comment paramétrer le keypressed pour ne pas avoir des champs en dur?
Ce que je ne comprends pas, keypressed concerne un champ jtextfield "parent.champAffichage".
Je suis dans l'obligation de le nommer dans la procédure, au lieu de dire quelque chose comme this.setTexte("erreur").
ainsi la procédure serait générique.
tu dis " S'il s'agit de pouvoir réutiliser Moteur_keypressedMS avec plusieurs instances de textfield, il suffit de passer en argument du constructeur la référence du textfield"
hors je ne gère pas les paramètres de keypressed. Je débute, peux tu me montrer ta façon de penser.
pour la pause, je voulais faire un test pour vérifier que ca marche.
Comment paramétrer le keypressed pour ne pas avoir des champs en dur?
Je ne comprends pas en changeant les parametres d'appels, la class ne fonctionne plus.
je tiens à rappeler que l'objectif était d'appeler la class keylistener.
avez vous un exemple d'appel à cette class avec un controle à l'intérieur générique à tous les jtextfield(s). (regarder j'en ai mis un)
je ne veux pas nommer un nom de champ de l'écran dans cette class.
J'ai dans le la procedure main
Moteur_keypressedMS Moteur_keypressedMS = new Moteur_keypressedMS(this, ???);
champAffichage.addkeylistener(Moteur_keypressedMS, ????)
champAffichage2.addkeylistener(Moteur_keypressedMS, ????)
J'ai reussi mais j'ai des erreurs dans la log.
j'ai maintenant plein d'anomalie dans la log
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Moteur_keypressedMS.keyReleased(Moteur_keypressedMS.java:39)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source) |
Désolé , j'ai fait une erreur de saisie. Ca marche!! je mes le code pour les copains
Dans le programme principal pour controler le champ
Code:
1 2 3 4 5
| JTextField ChampAffichage;
....
...
champAffichage.addKeyListener(new Moteur_keypressedMS(champAffichage, "text")); /"text"/ permettra d'agir en fonction du contexte. |
Pour la classe KeyListener
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
public class Moteur_keypressedMS implements KeyListener{
JTextField textField; // une référence au textfield
String valeurReset;
String Avant_saisie;
boolean fnum = false;
Moteur_keypressedMS(JTextField textField, String valeurReset) {
this.textField = textField;
this.valeurReset = valeurReset;
}
public void keyPressed(KeyEvent event) {
System.out.println("Code touche pressée : " + event.getKeyCode() + " - caractère touche pressée : " + event.getKeyChar());
// jTextField.getText() contient le texte présent dans le JTextField avant l'appui sur la touche
// e.getKeyChar() est le caractère correspondant à la touche pressée
char ch = event.getKeyChar();
if (ch == '0' ||ch == '1'||ch == '2' ||ch == '3' ||ch == '4' ||ch == '5' ||ch == '6' ||ch == '7' ||ch == '8' ||ch == '9' )
{fnum = true;} else { fnum = false; Avant_saisie = textField.getText(); }
//pause();
}
public void keyReleased(KeyEvent event) {
System.out.println("Code touche relâchée : " + event.getKeyCode() + " - caractère touche relâchée : " + event.getKeyChar());
//JOptionPane.showConfirmDialog(null, "quelquechose c produit keyReleased","ici en haut", JOptionPane.PLAIN_MESSAGE);
if (!fnum) {textField.setText(Avant_saisie);}
//pause();
}
public void keyTyped(KeyEvent event) {
System.out.println("Code touche tapée : " + event.getKeyCode() + " - caractère touche tapée : " + event.getKeyChar());
//JOptionPane.showConfirmDialog(null, "quelquechose c produit keyTyped","ici en haut", JOptionPane.PLAIN_MESSAGE);
if (!fnum) { textField.setText(Avant_saisie);}
//pause();
}
private void pause(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} |