2008-12-02 8 views
0

В приложении Swing метод должен продолжаться только после того, как пользователь вводит правильный ответ. Правильный ответ сохраняется в строке с ответом пользователя, устанавливаемым слушателем на другую строку. Таким образом, кодПравильный способ ожидания того, чтобы строки стали равными

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

Все в порядке с этим подходом или вы каким-то образом реорганизовали его? Разве это не налагает штраф на CPU? Вот несколько similar question.

ответ

5

Вы новичок в программировании пользовательского интерфейса? Причина, по которой я спрашиваю, заключается в том, что ваш ответ основывается на процедурном стиле кодирования, а это не то, что представляют собой пользовательские интерфейсы. Он, как правило, управляется событиями.

В этом случае решение довольно просто: добавьте прослушиватель событий (ActionListener) к кнопке отправки и проверьте результат там. Если все в порядке, продолжайте. Если нет, скажите так и дайте им попробовать еще раз.

0

Если ваши строки исходят от человека с графическим пользовательским интерфейсом, оптимизация производительности очень мала. Человек не сможет ввести более одной-трех строк в секунду, и это ничего для машины.

В этом конкретном случае, когда вам нужно сделать что-нибудь, чтобы получить ввод для тестирования, я бы предложил использовать цикл do-while.

2

Я не думаю, что у меня есть логика, но это напоминает мне старые Базовые времена ... :-) Я не понимаю, почему приложение заставляет пользователя вводить что-то уже известное (если оно не является пароль или что-то еще).

Вы пишете типизацию, наблюдаемую слушателем. Так почему бы не провести там тест? Не делайте цикл, ожидающий события, пусть Java это сделает (и другие вещи). При необходимости разбейте свою логику на две части и перейдите ко второй части, когда вы обнаружите, что правильный вход указан в слушателе.

Я надеюсь, что это имеет смысл ... ;-)

6

Как было предложено другими, вы должны использовать назначить прослушиватель кнопке, которая будет вызываться при нажатии кнопки.

Вот неполный пример, иллюстрирующий, как использовать ActionListener и реализации его actionPerformed метод, который вызывается при нажатии кнопки:

... 
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."); 
    } 
}); 
... 

Вы можете просто хотите реализовать ActionListener в классе, где кнопка и текст поле, поэтому вам не нужно объявлять два объекта как final. (Я просто использовал анонимный внутренний класс, чтобы сохранить пример коротким.)

Для получения дополнительной информации, вы можете взглянуть на How to Write an Action Listener от The Java Tutorials.

Кроме того, для общей информации о том, как работают события в Java, полезно использовать Lesson: Writing Event Listeners из учебных пособий по Java.

Edit: Изменено выражение внутри if заявления от textField.getText().equals("some text") к "some text".equals(textField.getText()) для того, чтобы предотвратить NullPointerException если textField был null, за предложение от г Shiny и комментарии New'S.

+0

Я рекомендую делать "некоторый текст" .equals (textField.getText()), чтобы не допустить исключения нулевого указателя, если GetText() возвращает нуль. Хорошая привычка проникать, когда вы сравниваете константу с переменной. – 2008-12-02 19:08:26

+0

А, спасибо, что указали это! Я отредактировал ответ, чтобы принять во внимание ваше предложение. – coobird 2008-12-03 01:29:09

2

Да, как говорили все здесь.

Для приложения gui лучший способ обработки ввода данных - подождать, пока событие будет запущено.

Затем для проверки ввода можно использовать метод, и если вы преуспеете, вы можете продолжить поток, который может перейти на другую страницу.

Вот полный (пока простой) пример экрана входа в систему, который проверяет ввод пользователя и успешно выполняет какое-либо действие.

Этот код не имеет другого значения, кроме показа в полном , готового к запуску образца, как эта концепция применяется.

simple gui 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(""); 
     } 
    } 
}