我有一个JSwing应用程序,询问用户一个问题,回答该问题,然后询问另一个问题。我的问题是,在回答第一个问题后,第二个问题出现(来自actionPerformed方法),但是下一个方法(检查器方法),需要将新的答案分配给响应变量并开始if else语句,似乎没有初始化。这是完整的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
public class hello extends JApplet implements ActionListener{
JTextArea questions;
JTextField answers;
JPanel panel;
String response;
public void init(){
questions = new JTextArea("Hello. State your name: ", 15, 65);
questions.setEditable(false);
questions.setLineWrap(true);
questions.setWrapStyleWord(true);
questions.setBackground(Color.black);
questions.setForeground(Color.green);
questions.setFont(new Font("Monaco", Font.PLAIN, 12));
answers = new JTextField("Type here", 65);
answers.setBackground(Color.black);
answers.setForeground(Color.green);
answers.setFont(new Font("Monaco", Font.PLAIN, 12));
answers.addActionListener(this);
panel = new JPanel();
panel.add(questions);
panel.add(answers);
panel.setSize(480, 280);
panel.setBackground(Color.black);
getContentPane().add(panel, BorderLayout.CENTER);
answers.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
answers.setText("");
}
});
}
public void actionPerformed(ActionEvent e){
response = answers.getText();
questions.setText("How are you " + response + "?");
answers.setText("");
}
public void checker(ActionEvent f){
response = answers.getText();
if(response.equals("well")){
questions.setText("glad to hear it");
}
else{
questions.setText("i'm sorry to hear that");
}
}
}
我们非常感谢任何建议。
答案 0 :(得分:1)
[...]但是下一个方法(检查方法),这是必需的 将新答案分配给响应变量并开始if else 声明,似乎没有初始化。
那么你永远不会在你的代码中调用checker()
方法然后它永远不会被执行:)
一些非主题提示:
checker()
方法不需要ActionEvent
作为参数,是吗?MouseListener
附加answers
,如果目标明确了用户关注此文字字段时的文字,那么我建议您附上FocusListener并在{{3}内清除其文字而不是方法。答案 1 :(得分:1)
您似乎对如何调用actionPerformed
感到困惑,并创建了一个永远不会被调用的checker
方法。
您已注册hello
课程以实施ActionListener
界面
也就是说,通过在setActionListener(this)
上调用JTextField
,当用户按Enter键时,将调用actionPerformed
。
我假设您希望用户在输入“well”后第二次按Enter键,并且将调用checker
。但是,您的JTextField
无法识别checker
,也无法调用它
您可以检查用户是否在使用actionPerformed
方法回答第二个问题;甚至可能创建一个枚举来检查当前问题的状态。
类似于:
private enum Question { FIRST, SECOND };
private Question current = FIRST; //can also initiate (but not declare) in init()
...
public void actionPerformed(ActionEvent e) {
if(current == FIRST) {
questions.setText("How are you " + answers.getText() + "?");
answers.setText("");
current = SECOND;
} else if(current == SECOND) {
if(answers.getText().equals("well"))
questions.setText("glad to hear it");
else
questions.setText("i'm sorry to hear that");
}
}
答案 2 :(得分:1)
panel = new JPanel();
panel.setLayout(new BorderLayout(0, 0));
panel.add(questions, BorderLayout.CENTER);
panel.add(answers, BorderLayout.SOUTH);
panel.setSize(480, 280);
panel.setBackground(Color.black);
试试这个。面板的默认布局是流布局。而answers
和questions
太大而无法展示。通过将布局设置为borderLayout可以调整其大小。