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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top