字符串文本在JAVA的appendText中不显示



我在Netbeans Java做一个猜谜游戏。比较猜测数字和目标数字后的结果(消息/字符串文本)没有显示在反馈面板TextArea中。我通过了文本从大型机类使用追加文本feedbackPanel类。然而,文本没有显示在反馈面板后,按猜测按钮。请帮帮我。

MainFrame.java

public class MainFrame extends JFrame{
FeedbackPanel formPanel;
InputPanel textPanel;
public static int target;
JTextArea ta;

public MainFrame()
{
super("HIgher-Lower Game");

formPanel=new FeedbackPanel();
add(formPanel, BorderLayout.EAST);

textPanel=new InputPanel();
add(textPanel, BorderLayout.WEST);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

formPanel.setFormListener(new FormListener(){
public void formEventOccurred(FormEvent e){
int num = e.getNum();
//int square=num*num;
if (num == target)
{
formPanel.appendText("Congratulations, your guess is correct!");
//formPanel.setText("Congratulations, your guess is correct!");
//ta.setText("Congratulations, your guess is correct!");
//System.out.paMairintln("Congratulations, your guess is correct!");
}
else if (num > target)
//if guess is higher than the target
{
formPanel.appendText("Your guess is higher than the target");
//formPanel.setText("Your guess is higher than the target");
//ta.setText("Your guess is higher than the target");
//System.out.println("Your guess is higher than the target");
}
else if (num < target)
//if guess is lower than the target
{
formPanel.appendText("Your guess is lower than the target");
//formPanel.setText("Your guess is lower than the target");
//ta.setText("Your guess is lower than the target");
//System.out.println("Your guess is lower than the target");
}
//textPanel.appendText(Integer.toString(square));
} 
});

textPanel=new InputPanel();
add(textPanel, BorderLayout.WEST);

setSize(300,300);
setVisible(true);
this.pack();

}

public static void main(String[] args) {
Random random = new Random();
target = random.nextInt(100);

SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame();
}
});
}
}

InputPanel.java

public class InputPanel extends JPanel {
private JLabel label1;
private JTextField tfIn;
private JButton b;

private FormListener formListener;
public FormListener getTextListener() {
return formListener;
}
public void setFormListener(FormListener formListener) {
this.formListener = formListener;
}
public InputPanel() {
GridBagLayout gb=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
gbc.insets=new Insets(5,5,5,5);
setLayout(gb);
setBorder(BorderFactory.createTitledBorder("InputForm"));

label1 = new JLabel ("Enter number [1-100]");
gbc.anchor=GridBagConstraints.FIRST_LINE_END;
gbc.gridx=1;
gbc.gridy=1;
gbc.gridheight=1;
gbc.gridwidth=1;
add(label1,gbc);

tfIn = new JTextField (10);
gbc.gridx=1;
gbc.gridy=2;
gbc.gridheight=1;
gbc.gridwidth=1;
add(tfIn,gbc);

b = new JButton ("Guess");
gbc.anchor=GridBagConstraints.CENTER;
gbc.gridx=1;
gbc.gridy=3;
gbc.gridheight=1;
gbc.gridwidth=2;
add(b,gbc);

b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int num = Integer.parseInt(tfIn.getText());
FormEvent ev=new FormEvent(this,num);
if(formListener != null){
formListener.formEventOccurred(ev);
}
}

});
}
}

FeedbackPanel.java

public class FeedbackPanel extends JPanel{
JTextArea ta;
FormListener listen;

public FeedbackPanel(){
setBorder(BorderFactory.createTitledBorder("Feedback"));
setLayout(new BorderLayout());
ta=new JTextArea(5,20);


add(new JScrollPane(ta), BorderLayout.CENTER);
}

public void appendText(String text){
ta.append(text + "n" + "r");

}
public void setFormListener(FormListener formListener) {
this.listen = formListener;
}



}

FormEvent.java

public class FormEvent extends EventObject{
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}

public FormEvent(Object source){
super(source);
}

public FormEvent(Object source, int num){
super(source);
this.num=num;
}
}

FormListener.java

public interface FormListener extends EventListener{
public void formEventOccurred(FormEvent e); 

}

代码中的问题:

#1是,MainFrame中的formeventooccurs()永远不会被调用。出现这个问题是因为有两个面板,两个面板需要互相沟通。您通过创建接口解决了这个问题,这是正确的。但是调用了错误类的接口。

#2是,您创建并添加了两次textPanel。这应该不会引起描述问题,但这并不是很好。

#3是变量命名不当。请看一下命名约定。这段代码不容易读。

#4不是真正的问题,但关键字static如果不需要就不应该使用。

#5是,如果可以将原始数据类型和对象声明为局部变量,则不应将其声明为类属性(字段)。这对于可读性来说要好得多。

#6是,代码中有很多冗余。如果程序员在阅读自己的代码时遇到问题,就会出现这种情况。如果是这样,那并不直接"不好",这对初学者来说是正常的。下次,尝试使用变量名来编写更可读的代码,这些变量名"告诉他们的工作是什么",等等。

#7是,在一般情况下,使变量"私有"是一个很好的做法。直到你需要将它们设为public或protected,等等。

现在,通过学习获得乐趣!

工作代码:

这是工作代码的完整版本:

类:大型机

public class MainFrame extends JFrame {
private int numberToGuess;
public MainFrame() {
/* general things */
numberToGuess = new Random().nextInt(100);
/* feedbackPanel */
FeedbackPanel feedbackPanel = new FeedbackPanel();
add(feedbackPanel, BorderLayout.EAST);
/* inputPanel */
InputPanel inputPanel = new InputPanel();
inputPanel.setFormListener(new FormListener() {
@Override
public void formEventOccurred(FormEvent e) {
int guessedNumber = e.getNum();
if (guessedNumber == numberToGuess) {
feedbackPanel.appendText("Congratulations, your guess is correct!");
} else if (guessedNumber > numberToGuess) {
feedbackPanel.appendText("Your guess is higher than the target");
} else if (guessedNumber < numberToGuess) {
feedbackPanel.appendText("Your guess is lower than the target");
}
}
});
add(inputPanel, BorderLayout.WEST);
/* frame settings */
setTitle("Higher-Lower Game");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
setVisible(true);
this.pack();
}
public static void main(String[] args) {
new MainFrame();
}
}

类:FeedbackPanel

public class FeedbackPanel extends JPanel {
private JTextArea textArea;
public FeedbackPanel() {
setBorder(BorderFactory.createTitledBorder("Feedback"));
setLayout(new BorderLayout());
textArea = new JTextArea(5, 20);
add(new JScrollPane(textArea), BorderLayout.CENTER);
}
public void appendText(String text) {
textArea.append(text + "n" + "r");
}
}

类:InputPanel

public class InputPanel extends JPanel {
private JLabel label1;
private JTextField tfIn;
private JButton button;
private FormListener formListener;
public InputPanel() {
GridBagLayout gb = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5);
setLayout(gb);
setBorder(BorderFactory.createTitledBorder("InputForm"));
label1 = new JLabel("Enter number [1-100]");
gbc.anchor = GridBagConstraints.FIRST_LINE_END;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridheight = 1;
gbc.gridwidth = 1;
add(label1, gbc);
tfIn = new JTextField(10);
gbc.gridx = 1;
gbc.gridy = 2;
gbc.gridheight = 1;
gbc.gridwidth = 1;
add(tfIn, gbc);
button = new JButton("Guess");
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridheight = 1;
gbc.gridwidth = 2;
add(button, gbc);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int num = Integer.parseInt(tfIn.getText());
FormEvent ev = new FormEvent(this, num);
if (formListener != null) {
formListener.formEventOccurred(ev);
}
}
});
}
public void setFormListener(FormListener formListener) {
this.formListener = formListener;
}
}

类:FormEvent

public class FormEvent extends EventObject {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public FormEvent(Object source) {
super(source);
}
public FormEvent(Object source, int num) {
super(source);
this.num = num;
}
}

接口:FormListener

public interface FormListener extends EventListener {
public void formEventOccurred(FormEvent e);
}

最新更新