ActionListener触发来自JTextField的文本输入

时间:2015-08-05 02:07:36

标签: java actionlistener

我想通过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(":(");
            }
        }
    });

问题是因为还有其他问题,每当用户输入“是”时,响应就是“酷!”。我希望它只能说“酷!”当答案是“是”并且问题是“你最喜欢的颜色是红色吗?”。

3 个答案:

答案 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

控制响应

例如......

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进行多选答案。