Java KeyListener pas tirer sur JSpinner
-
28-09-2019 - |
Question
ont essayé quelques approches différentes pour cela, mais sans succès jusqu'à présent. Juste demandé si je me manque quelque chose. J'ai un JSpinner qui est un composant d'un widget dateSelector à côté d'un calendrier. Je suis en train de tirer une méthode de validation si l'utilisateur change de texte dans le JSpinner au lieu d'utiliser le contrôle du calendrier ou JSpinner flèches haut et bas.
Voici les différentes approches que j'ai essayé:
jSpinner1.addKeyListener(kl);
jSpinner1.getEditor().addKeyListener(kl);
((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);
Quelqu'un là-bas a des idées sur ce que je fais mal? Merci
UPDATE Toutes mes excuses, j'aurais dit que je l'ai déjà ajouté un ChangeListener au JSpinnerDateModel qui est attaché à la JSpinner. Comme ceci:
ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
dateChanged();
}
};
jSpinnerDateModel.addChangeListener(changeListener);
KeyListener keyListener = new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyChar());
dateChanged();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
};
((JSpinner.DefaultEditor) jSpinner1.getEditor()).getTextField().addKeyListener(
keyListener);
Merci
Frank
La solution
JSpinners poignée KeyEvents eux-mêmes, mais ils tirent ChangeEvents au monde extérieur. Ajout d'un ChangeListener devrait vous permettre d'effectuer la validation que vous le souhaitez.
Voir aussi: Detecting Spinner Value Changes (Java Tutoriels)
Autres conseils
Si vous souhaitez désactiver la modification du clavier faire:
JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);
Pour écouter les événements clés que vous devez ajouter un écouteur au champ texte. Cela fonctionne pour moi:
((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("PRESSED!");
}
@Override
public void keyTyped(KeyEvent e) {
}
});
Ceci est un manque de swing, et à mon avis JSpinner devrait suivre JComboBox dans la fourniture de l'accès suivant au champ de texte sous-jacent:
JComboBox.getEditor().getEditorComponent()
De passer par la source de J1.7 je trouve que vous pouvez acheive à peu près la même chose avec
JSpinner.getEditor().getComponent(0)
Par conséquent, vous pouvez « pirater » l'auditeur de la manière suivante:
JSpinner.getEditor().getComponent(0).addKeyListener(...)
Il est évident que cela dépend de la «sous les couvertures de la mise en œuvre du swing et de travaux au J1.7, mais il n'y a aucune garantie que cela fonctionne pour d'autres versions futures ou passées.
Profitez.
EDIT
ou si l'éditeur est une instance de DefaultEditor, vous pouvez lancer en tant que tel et utilisation getTextField () '. Il serait utile si cela était défini dans l'interface.