我想通过JTextArea向用户提问,并在ActionListener中评估答案。这是我的(示例)代码:
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String text = textField.getText();
textArea.setText("Is your favorite color Red?");
if (text.replaceAll("'", "").toLowerCase().contains("yes")){
textArea.setText("Cool!");
}else if (text.replaceAll("'", "").toLowerCase().equals("no")){
textArea.setText(":(");
}
}
});
问题是因为还有其他问题,每当用户输入“是”时,响应就是“酷!”。我希望它只能说“酷!”当答案是“是”并且问题是“你最喜欢的颜色是红色吗?”。
答案 0 :(得分:1)
您在事件驱动的环境中操作,因此您需要提出问题并等待用户的回复。
想一想有点不同。你有一个"问题",它已根据用户输入规定了输出。
你需要的是将问题的答案与问题联系起来的一些方法,幸运的是,Java是一种OO语言......
从一些问题概念开始
public interface Question {
public String getPrompt();
public String getResponse(String input);
}
public abstract class AbstractQuestion implements Question {
private String prompt;
public AbstractQuestion(String prompt) {
this.prompt = prompt;
}
@Override
public String getPrompt() {
return prompt;
}
}
现在,我们需要一些方法来应用当前的问题......
private JTextArea ta;
//...
private Question question;
//...
public void setQuestion(Question q) {
if (question != q) {
question = q;
if (question != null) {
ta.append(question.getPrompt() + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
}
}
现在,当ActionListener
时,我们需要询问Question
对输入的回复......
@Override
public void actionPerformed(ActionEvent e) {
if (question != null) {
String response = question.getResponse(tf.getText().trim());
ta.append(response + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
}
这样,您可以根据当前Question
例如......
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextArea ta;
private JTextField tf;
private Question question;
public TestPane() {
setLayout(new BorderLayout());
ta = new JTextArea(10, 30);
ta.setEditable(false);
add(new JScrollPane(ta));
tf = new JTextField(10);
add(tf, BorderLayout.SOUTH);
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (question != null) {
String response = question.getResponse(tf.getText().trim());
ta.append(response + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
}
});
setQuestion(new AbstractQuestion("Is your favorite color Red?") {
@Override
public String getResponse(String input) {
String response = "To bad, mine is";
if ("yes".equalsIgnoreCase(input)) {
response = "Cool!";
}
return response;
}
});
}
public void setQuestion(Question q) {
if (question != q) {
question = q;
if (question != null) {
ta.append(question.getPrompt() + "\n");
ta.setCaretPosition(ta.getDocument().getLength());
}
}
}
}
public interface Question {
public String getPrompt();
public String getResponse(String input);
}
public abstract class AbstractQuestion implements Question {
private String prompt;
public AbstractQuestion(String prompt) {
this.prompt = prompt;
}
@Override
public String getPrompt() {
return prompt;
}
}
}
这种方法将UI /用户输入与问题逻辑分离,并允许您将生成响应的责任与问题实例隔离开来,从而使您可以提出无限数量的问题。需要生成很长的if-else
语句列表
答案 1 :(得分:0)
尝试类似
的内容String question = "Is your favorite color Red?";
textArea.setText(question);
if(textArea.getText().equals(question))
{
if (text.replaceAll("'", "").toLowerCase().contains("yes")){
textArea.setText("Cool!");
}else if (text.replaceAll("'", "").toLowerCase().equals("no")){
textArea.setText(":(");
}
}
答案 2 :(得分:0)
您正在将文本区域设置为"您最喜欢的颜色是红色吗?",然后稍后用" Cool!"替换它。相反,你应该使用类似下面的内容,这样你只需要用你需要的一切设置JTextArea的文本。
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String text = textField.getText();
StringBuilder sb = new StringBuilder();
sb.append("Is your favorite color Red?\n");
if (text.replaceAll("'", "").toLowerCase().contains("yes")){
sb.append("yes\nCool!");
} else if (text.replaceAll("'", "").toLowerCase().equals("no")){
sb.append("no\n:(");
}
textArea.setText(sb.toString());
}
});
我的代码插入"是"和"不"回答JTextArea中的特定位置,因此您可能需要更改它并找出您想要它的确切位置。
但请注意,如果我使用Swing编程,我会使用JLabel来解决问题和答案,并使用JRadioButton进行多选答案。