我遇到的问题是ActionListener
没有表现出来(我认为)他们应该这样做。我有以下代码:
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
是程序回答的地方。
问题是,当我输入"什么是新的",然后"是"时,它为我提供了我设置的默认字符串,当它不理解时。
答案 0 :(得分:4)
你不是第四维想的! (现在开玩笑)
您正试图在听众中一次处理事件序列,但实际上会多次调用您的监听器:一次是对第一个问题的回答,另一次是对您的后续评论的回复。< / p>
您需要让侦听器独立处理这两种状态。您可能需要在类范围中捕获上次提问的状态并在监听器中检查以确定询问的问题,以便您知道如何评估text
的内容并给出正确的答复。 / p>
你可能不会在几个学期内学习有限自动机或状态机的正式学习,但这是对基本理解的关键步骤。在不知道所提供的问题陈述的情况下,我认为该任务正试图将您推向这个方向。此外,在任何范例中,虽然对于Java我们会坚持使用OO,但是有很多方法可以添加一些美观和容错层以获得更好的解决方案,但我的目的是坚持使用最简单的方法。例如,您可以创建一个表示每个状态的类,等待用户的响应(问题1,问题2等)并对应用程序中的状态和转换进行建模。建模的每个州都知道问题,潜在答案和过渡到其他州。在OO系统中,这些状态中的每一个都具有API并且通过诸如execute()
之类的调用来操作,该调用将评估系统的当前状态并确定转换。自己做一些关于此的研究。
回到更简单的例子。我们假设你只有两个案例,每个问题一个:&#34;什么是新的&#34;和#34;你编程&#34;。在你的类中存储一些表示(命名常量是很好的做法):
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()))
然后您就知道了显示初始(未提示)问题的答案并输入预期响应。不要忘记格式化翻译(小写,条形引号)。
答案 1 :(得分:0)
它为您提供默认值,因为第二个if语句位于第一个if语句内。当第一个测试为真时,嵌套在第一个测试中的第二个测试将为false,并使用else子句覆盖textArea并使用默认文本。你应该做这样的事情
if (text.toLowerCase().replaceAll("'", "").contains("whats new")){
...
}
else if (text.toLowerCase().replaceAll("'", "").contains("yes")) {
...
}
else {
...
}