Java KeyListener no disparar sobre JSpinner
-
28-09-2019 - |
Pregunta
han tratado algunos enfoques diferentes para esto, pero sin éxito hasta el momento. Sólo se preguntó si me falta nada. Tengo un JSpinner que es un componente de un widget DateSelector junto a un calendario. Estoy tratando de disparar un método de validación si el usuario cambia cualquier texto en el JSpinner lugar de utilizar el control de calendario o el JSpinner flechas arriba y abajo.
Estos son los diferentes enfoques que he intentado:
jSpinner1.addKeyListener(kl);
jSpinner1.getEditor().addKeyListener(kl);
((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);
Alguien por ahí tiene alguna idea en cuanto a lo que estoy haciendo mal? Gracias
Actualizar Disculpas, que debería haber dicho que ya he añadido una ChangeListener a la JSpinnerDateModel que está unido a la JSpinner. De esta manera:
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);
Gracias
Frank
Solución
JSpinners manejan KeyEvents sí mismos, sino que el fuego ChangeEvents con el mundo exterior. La adición de un ChangeListener debe permitir llevar a cabo la validación desea.
Ver también: Detectando Spinner Cambios de valor (Java tutoriales)
Otros consejos
Si desea desactivar el teclado de edición de hacer esto:
JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);
Para escuchar los sucesos clave que necesita añadir un oyente al campo de texto. Esto funciona para mí:
((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) {
}
});
Este es un déficit de oscilación, y en mi opinión JSpinner debe seguir JComboBox en el suministro de los siguientes accesos al campo de texto subyacente:
JComboBox.getEditor().getEditorComponent()
A partir de pasar por la fuente de J1.7 he encontrado que puede acheive más o menos lo mismo con
JSpinner.getEditor().getComponent(0)
Por lo tanto se puede "cortar" el oyente de la siguiente manera:
JSpinner.getEditor().getComponent(0).addKeyListener(...)
Obviamente, esto depende de la '' bajo las sábanas implementación de media vuelta y obras como en J1.7, pero no hay garantía de que esto funcione para otra futura o pasada versiones.
Disfrute.
Editar
o si el editor es una instancia de DefaultEditor, se puede lanzar como tal y su uso 'getTextField ()'. Sería útil si esto se define en la interfaz.