java ActionListener代理wierd
我对我的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
是程序回答问题的地方。
问题是,当我输入“Whatsnew”,然后输入“yes”时,当它不理解时,它会给我设置的默认字符串
# 1 楼答案
你没有从第四维度思考!(开玩笑吧)
你试图在你的听众中一次处理一系列事件,但实际上你的听众会被多次呼叫:一次是为了回答第一个问题,另一次是为了回答你的后续评论
你需要让你的听众独立处理这两种状态。你可能需要在类范围内捕捉上一个问题的状态,并在听者中检查它,以确定问了什么问题,这样你就知道如何评估
text
的内容并给出正确的回答在接下来的几个学期里,你可能不会学习有限自动机,也不会正式学习状态机,但这是基本了解状态机的关键一步。在不知道所提供的问题陈述的情况下,我认为这项任务正试图把你推向那个方向。此外,在任何范例中,尽管对于Java,我们将坚持使用OO,但有许多方法可以添加一些美观和容错层,以获得更好的解决方案,但我的意图是坚持使用对您来说最简单的方法。例如,您可以创建一个类来表示等待用户响应的每个状态(问题1、问题2等),并对应用程序中的状态和转换进行建模。建模的每个州都知道所问的问题、可能的答案以及向其他州的过渡。在OO系统中,这些状态中的每一个都有一个API,并通过诸如
execute()
之类的调用进行操作,该调用将评估系统的当前状态并确定转换。你自己再做一些研究回到你简单的例子。假设你只有两个案例,每个问题一个:“新内容”和“你编程了吗?”。在类中存储一些表示(命名常量是很好的做法):
现在,在
actionPerformed
中,根据已知问题测试问题文本区的内容,并根据已知回答测试答案区的内容:if (a1.equals(textArea.getText() && q2.equals(text.getText()))
然后您知道初始(未提示)问题的答案显示出来,并输入了预期的回答。不要忘记格式转换(小写,带引号)# 2 楼答案
它提供默认值,因为第二个if语句位于第一个if语句内。当第一个测试为true时,嵌套在第一个测试中的第二个测试将为false,将else子句括起来,以默认文本覆盖textArea。你应该这样做