java while-loop cpu-cycles

java - La forma correcta de esperar que las cuerdas se vuelvan iguales



while-loop cpu-cycles (5)

¿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 se tratan las IU. Tiende a ser impulsado por eventos.

En este caso, la solución es bastante fácil: agregue un detector de eventos (ActionListener) al botón de envío y verifique el resultado allí. Si está bien, sigue. Si no, dilo y deja que intenten de nuevo.

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 de alguna manera lo refactorizaría? ¿No impone una penalización adicional a la CPU? Aquí hay una pregunta algo similar .


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

Usted escribe que un oyente observa la escritura. Entonces, ¿por qué no hacer la prueba allí? No hagas un bucle esperando un evento, deja 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 se da la entrada correcta en el oyente.

Espero que esto tenga sentido... ;-)


Si sus cadenas provienen de un usuario humano a precios de GUI, no tiene mucho sentido optimizar el rendimiento. El ser humano no podrá ingresar más de tal vez de una a tres cuerdas 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, le sugiero que use un ciclo do-while while.


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

Aquí hay un ejemplo incompleto que ilustra cómo usar un ActionListener e implementar su método actionPerformed 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."); } }); ...

Puede que desee implementar ActionListener en la clase donde residen el botón y el campo de texto, por lo que no necesita declarar los dos objetos como final . (Acabo de utilizar una clase interna anónima para mantener corto el ejemplo).

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

Además, para obtener información general sobre cómo funcionan los eventos en Java, la Lección: Escritura de oyentes de eventos de The Java Tutorials puede ser útil.

Editar: Se modificó la expresión dentro de la instrucción if de textField.getText().equals("some text") a "some text".equals(textField.getText()) para evitar una NullPointerException si textField era null , por sugerencia de El Sr. Shiny y el comentario de New.


Sí, como todos dijeron aquí.

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

Luego, se puede 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 (aunque 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 y lista para ejecutarse 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."); 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 ( "".equals(password.getText())) try { Desktop.getDesktop().browse( new URI("http://.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(""); } } }