Pregunta

En una aplicación Swing, un método debe continuar solo después de que el usuario ingrese una respuesta correcta. La respuesta correcta se almacena en una Cadena con la respuesta del usuario establecida por un oyente a otra Cadena. Entonces, el código es

while (!correctAnswer.equals(currentAnswer)) {
         // wait for user to click the button with the correct answer typed into the textfield
}
// and then continue

¿Está todo bien con este enfoque o lo refactorizarías de alguna manera? ¿No impone una penalización adicional a la CPU? Aquí hay algo pregunta similar .

¿Fue útil?

Solución

¿Eres nuevo en la programación de UI? La razón por la que pregunto es que su respuesta se basa en un estilo de codificación de procedimiento, que no es de lo que tratan las IU. Tiende a ser controlado por eventos.

En este caso, la solución es bastante fácil: agregue un detector de eventos (ActionListener) al botón Enviar y verifique el resultado allí. Si está bien, continúa. Si no es así, dilo y deja que lo intenten nuevamente.

Otros consejos

Como otros han sugerido, querrá usar asignar un oyente al botón, que se llamará cuando se presione el botón.

Aquí hay un ejemplo incompleto que ilustra cómo usar un ActionListener e implementando su actionPerformed método que se llama cuando se presiona el botón:

...
final JTextField textField = new JTextField();
final JButton okButton = new JButton("OK");
okButton.addActionListner(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        if ("some text".equals(textField.getText()))
            System.out.println("Yes, text matches.");
        else
            System.out.println("No, text does not match.");
    }
});
...

Es posible que solo desee implementar < code> ActionListener en la clase donde reside el botón y el campo de texto, por lo que no necesita declarar los dos objetos como final . (Acabo de usar una clase interna anónima para mantener el ejemplo breve).

Para obtener más información, puede consultar Cómo escribir un oyente de acción de Los tutoriales de Java .

Además, para obtener información general sobre cómo funcionan los eventos en Java, el Lección: Escribir oyentes de eventos de los Tutoriales de Java puede ser útil.

Editar: Cambió la expresión dentro de la instrucción if de textField.getText (). equals (" some text ") a " algún texto " .equals (textField.getText ()) para evitar una NullPointerException si textField era null , por sugerencia del comentario del Sr. Shiny y New.

No creo que tenga la lógica allí, pero me recuerda a los viejos tiempos básicos ... :-) No veo por qué la aplicación obliga al usuario a escribir algo ya conocido (a menos que sea una contraseña o algo).

Usted escribe la escritura es observada por un oyente. Entonces, ¿por qué no hacer la prueba allí? No haga un bucle esperando un evento, deje que Java lo haga (y otras cosas). Si es necesario, divida su lógica en dos y vaya a la segunda parte cuando detecte que la entrada correcta se da en el oyente.

Espero que esto tenga sentido ... ;-)

Sí, como todos dijeron aquí.

Para una aplicación gui, la mejor manera de manejar la entrada del usuario es esperar a que se active un evento.

Entonces se podría usar un método para validar la entrada y, si tiene éxito, puede continuar con el flujo, que podría ir a otra página.

Aquí hay un ejemplo completo (pero simple) de una pantalla de inicio de sesión, que valida la entrada del usuario y, si tiene éxito, realiza alguna acción.

Este código no tiene otro valor que mostrar en una muestra completa lista para ejecutar cómo se aplica este concepto.

gui simple http://img229.imageshack.us/img229/1532/simplenz0 .png

// * used for brevity. Preffer single class per import
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;


public class MatchString{

    private final JTextField password;
    private final JFrame frame;

    public static void main( String [] args ){
        MatchString.show();
    }

    public static void show(){
        SwingUtilities.invokeLater( new Runnable(){
            public void run(){
                new MatchString();
            }
        });
    }

    private MatchString(){
        password = new JPasswordField( 20 );
        frame = new JFrame("Go to www.stackoverflow");
        init();
        frame.pack();
        frame.setVisible( true );
    }


    private void init(){

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        frame.add( new JPanel(){{
            add( new JLabel("Password:"));
            add( password );
        }});

        // This is the key of this question.
        // the password textfield is added an 
        // action listener
        // When the user press enter, the method 
        // validatePassword() is invoked.
        password.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                validatePassword();
            }
        });
    }


    private void validatePassword(){            
        // If the two strings match
        // then continue with the flow
        // in this case, open SO site.    
        if ( "stackoverflow".equals(password.getText())) try {
            Desktop.getDesktop().browse( new URI("http://stackoverflow.com"));
            frame.dispose();
        } catch ( IOException ioe ){
            showError( ioe.getMessage() );
        } catch ( URISyntaxException use ){
            showError( use.getMessage() );
        } else {
            // If didn't match.. clear the text.
            password.setText("");
        }
    }
 }

Si sus cadenas provienen de un usuario humano a tasas de GUI, no tiene mucho sentido optimizar el rendimiento. El humano no podrá ingresar más de una o tres cadenas por segundo, y eso no es nada para la máquina.

En este caso particular, donde necesita hacer cosas para obtener una entrada para probar, sugeriría usar un do-while loop.

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