Java KeyListener Brennen nicht auf JSpinner
-
28-09-2019 - |
Frage
hat ein paar verschiedenen Ansätze, um dies versucht, aber ohne Erfolg bisher. Nur gefragt, ob ich etwas fehlt bin. Ich habe eine JSpinner, die Bestandteil eines DateSelector Widget neben einem Kalender ist. Ich versuche, eine Validierungsmethode zu feuern, wenn der Benutzer eines beliebigen Text in dem JSpinner ändert anstelle die Kalendersteuerung oder die JSpinner nach oben und unten Pfeilen.
Hier sind die verschiedenen Ansätze ich versucht habe:
jSpinner1.addKeyListener(kl);
jSpinner1.getEditor().addKeyListener(kl);
((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);
Jeder da draußen irgendwelche Ideen bekam, was ich falsch mache? Dank
UPDATE Apologies, hätte ich sagen sollen, dass ich bereits ein Change zum JSpinnerDateModel hinzugefügt, die an den JSpinner angebracht ist. Wie so:
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);
Danke
Frank
Lösung
JSpinners Griff KeyEvents selbst, aber sie feuern ChangeEvents an die Außenwelt. Hinzufügen eines Change sollte Ihnen ermöglichen, die Validierung Sie durchführen möchten.
Siehe auch: Detecting Spinner Wertänderungen (Java Tutorials)
Andere Tipps
Wenn Sie zu deaktivieren Tastatur Bearbeitung möchten Sie folgendermaßen vor:
JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);
für wichtige Ereignisse hören Sie benötigen einen Zuhörer in das Textfeld hinzuzufügen. Dies funktioniert für mich:
((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) {
}
});
Dies ist ein Fehlbetrag von Swing, und meiner Meinung nach sollte JSpinner JComboBox folgt bei der Versorgung des folgenden Zugriff auf das darunter liegende Textfeld:
JComboBox.getEditor().getEditorComponent()
Von gehen durch die Quelle von J1.7 Ich fand dich so ziemlich die gleiche Sache acheive kann mit
JSpinner.getEditor().getComponent(0)
Sie können also „Hack“ den Hörer auf die folgende Weise:
JSpinner.getEditor().getComponent(0).addKeyListener(...)
Natürlich hängt dies von der ‚unter der Decke‘ Umsetzung des Swing und funktioniert wie bei J1.7, aber es gibt keine Garantie, das funktioniert für andere Versionen Zukunft oder Vergangenheit.
Genießen.
Bearbeiten
oder wenn der Editor eine Instanz von DefaultEditor ist, können Sie es als solche und Verwendung ‚getTextField ()‘ gegossen. Es wäre praktisch, wenn dies in der Schnittstelle definiert wurde.