2015-08-06 3 views
1

У меня проблема с моим ActionListener 's, не действующим как (я думаю), они должны. У меня есть следующий код:ActionListener действующий wierd

textField.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      final String text = textField.getText(); 
      if (text.toLowerCase().replaceAll("'", "").contains("whats new")){ 
       textArea.setText("Oh, you know...work...college. I am a computer science major and software engineer.\nDo you program?"); 
       if (text.toLowerCase().replaceAll("'", "").contains("yes")){ 
        textArea.setText("Cool!"); 
       }else{ 
        textArea.setText(":("); 
       } 
      } 
      } 
     }); 

textField является, где пользователь печатает вопрос, а textArea это где программа ответы. Проблема в том, что когда я набираю «Whats new», то «yes», он дает мне строку по умолчанию, которую я установил, когда она не понимает.

ответ

4

Вы не думаете о четвертом измерении! (шутите в сторону сейчас)

Вы пытаетесь обрабатывать последовательность событий сразу в своем слушателе, но ваш слушатель будет называться несколько раз: один раз для ответа на первый вопрос и второй раз для ответа на ваш вопрос последующий комментарий.

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

Возможно, вы не изучите конечные автоматы или формальное изучение государственных машин еще на несколько семестров, но это важный шаг к элементарному пониманию. Не зная постановку проблемы, я предполагаю, что задание пытается подтолкнуть вас в этом направлении. Кроме того, в любой парадигме, хотя для Java мы будем придерживаться OO, есть много способов добавить некоторые слои красоты и отказоустойчивости для лучшего решения, но я намерен придерживаться того, что для вас наиболее просто. Например, вы можете создать класс, который представляет каждое состояние в ожидании ответа пользователя (вопрос 1, вопрос 2 и т. Д.) И моделировать состояния и переходы внутри вашего приложения. Каждое состояние, которое смоделировано, будет знать о заданном вопросе, потенциальных ответах и ​​переходах в другие государства. В системе OO каждое из этих состояний будет иметь API и работать через некоторый вызов, например execute(), который будет оценивать текущее состояние системы и определять переход. Сделайте еще несколько исследований по этому вопросу самостоятельно.

Обратно к вашему простому примеру. Допустим, у вас есть только два случая: по одному для каждого вопроса: «что нового» и «вы программируете». Храните некоторое представление в классе (именованные константы являются хорошей практикой):

class Interrogator { 
    String q1 = "what's new"; 
    String a1 = ...do you program?"; 
    String q2 = "yes"; 
    ... 
} 

теперь в вашем actionPerformed, проверить содержимое как ваш вопрос-текст-область от известных вопросов и ваш ответ район от известных ответов: if (a1.equals(textArea.getText() && q2.equals(text.getText())), то вы знаете, что отображается ответ на начальный (неуправляемый) вопрос, и был введен ожидаемый ответ. Не забывайте, что ваш форматирующий перевод (в нижнем регистре, кавычки).

+0

У вас есть пример, который я могу использовать? http://hastebin.com/ –

+0

Я не хочу давать хороший рабочий пример или псевдокод, который более чем дико высокий уровень, так как это, похоже, упражнение, предназначенное для вас. –

+0

У вас есть статья или подсказка? –

0

Он дает вам значение по умолчанию, потому что второй оператор if находится внутри первого. Когда первый тест верен, второй тест, который вложен в первый тест, будет ложным, обменивает предложение else, чтобы переопределить текст TextArea с текстом по умолчанию. Вы должны сделать что-то вроде этого

if (text.toLowerCase().replaceAll("'", "").contains("whats new")){ 
    ...  
} 
else if (text.toLowerCase().replaceAll("'", "").contains("yes")) { 
    ... 
} 
else { 
    ... 
} 
+0

, что заставляет его вернуться «Круто!» если вы наберете «да» вообще. –

+0

- это то, чего вы не хотите? – ivange94

+0

если есть другие вопросы с ответом на да (что есть), он всегда говорит «Круто!» –