Pregunta

En primer lugar, para hacer mi trabajo explicando un poco más fácil, aquí está parte de mi código:

JSpinner spin = new JSpinner();
JFormattedTextField text = getTextField(spin);

text.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
            // Do stuff...
    }
});

...

private JFormattedTextField getTextField(JSpinner spinner) {
    JComponent editor = spinner.getEditor();

    if (editor instanceof JSpinner.DefaultEditor) {
        return ((JSpinner.DefaultEditor )editor).getTextField();
    } else {
        System.err.println( "Unexpected editor type: "
                           + spinner.getEditor().getClass()
                           + " isn't a descendant of DefaultEditor" );
        return null;
    }
}

Así como se puede ver, llegué tan lejos. Y de hecho, cuando escribo en un valor en el componente de campo de texto de la ruleta (JFormattedTextField), y presione ENTRAR, funciona.

Lo que quiero ahora es ser capaz de recibir la respuesta del campo de texto para entrar sin tener que escribir manualmente en un nuevo valor (lo que contradice sorta el propósito de hacer un control de giro fuera de él). ¿Cómo lo hago?

¿Fue útil?

Solución

Sé que esto no es el oyente de action ... pero tal vez esto puede funcionar para usted?


    text.addKeyListener( new KeyAdapter() {
            @Override
            public void keyReleased( final KeyEvent e ) {
                if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
                    System.out.println( "enter pressed" );
                }
            }
        } );

Otros consejos

Me acabo de encontrar con un problema relacionado con esto, a mí mismo. En mi caso, tuve un JSpinner con una configuración SpinnerNumberModel por lo que pude valores numéricos de identificación de entrada, y luego recuperarlas de una base de datos remota. Esto funcionó muy bien con un JButton como mi detonante de la consulta, pero quería ser capaz de cambiar el foco al campo a través de la lengüeta, y pulsa enter, y también ser capaz de cambiar el valor mediante la introducción de una identificación con teclas numéricas , a continuación, pulsa enter.

El que me estaba dando la mayoría de los problemas estaba entrando manualmente la ID con las teclas numéricas y pulsar ENTER. Cuando Me gustaría hacer esto, la consulta todavía iba a pasar, pero era la consulta de la identificación anterior, más que la que acaba de entrar, así que me gustaría tener que tocar entrar de nuevo para consultar el nuevo ID (ver código)

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            queryData();
        }
    }
});

y el método de consulta:

private void queryData() {
    int minVal = Integer.parseInt(minRng.getValue().toString());
    queryDataBase(minVal);
}

Con el fin de solucionar este problema, todo lo que tenía que hacer era forzar la consulta que esperar para correr hasta que el spinner actualiza su valor, lo que se hace fácilmente mediante el uso de SwingUtilities.invokeLater() a la fuerza hasta el final de la cola de EDT, así:

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    queryData();
                }
            });
        }
    }
});

Gracias a la invokeLater() la consulta ahora sucede en el nuevo valor en lugar de la anterior, al presionar entrar, como el JSpinner entonces ha actualizado su valor para la nueva entrada.

Estoy asumiendo que la razón de esto es que el valor introducido no se aplica oficialmente a la JSpinner hasta llegar a entrar, que también dispara el detector de teclas para la consulta. El KeyEvent de la costumbre [consulta] oyente clave parece ser el primero en la cola, lo que se ejecuta su código en primer lugar, y luego el KeyEvent para aplicar el valor a la JSpinner del JFormattedTextField interna, por lo que consulta la edad valor. SwingUtilities.invokeLater() sólo pone la propia consulta al final de la cola, lo que permite que la otra KeyEvent para terminar su código antes de ejecutar la consulta.

Editar

Otra forma de lograr esto es para solicitar el valor directamente desde el lugar de la JFormattedTextField JSpinner, ya que esto también debe devolver el valor que acaba de introducir desde el JFormattedTextField contiene el valor que haya escrito, pero aún no se ha pasado a la JSpinner, que parece estar donde radica el problema.

private void queryData() {
    JFormattedTextField tf = ((JSpinner.DefaultEditor) minRng.getEditor()).getTextField();
    int minVal = Integer.parseInt(tf.getText());
    queryDataBase(minVal);
}

El único problema con este método es que luego hay que coger cualquier NumberFormatExceptions, al analizar el valor, donde el enfoque SwingUtilities.invokeLater() permite que el modelo giratorio para eliminar los caracteres no válidos, de forma automática, y continuar con la consulta.

De todos modos, todavía estoy un poco inexperto con Java, por lo que si mi comprensión de esto es incorrecto, por favor hágamelo saber en los comentarios.

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