import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class MyGUI extends JFrame implements ActionListener
{
JButton btnA;
public MyGUI()
{
setTitle("Test GUI");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setLayout(null);
setLocationRelativeTo(null);
JButton btnA=new JButton("A");
btnA.setSize(100, 20);
btnA.setLocation(0, 0);
btnA.addActionListener(this);
add(btnA);
}
public void actionPerformed(ActionEvent e)
{
System.out.println(e.toString());
System.out.println("Action detected");
if(e.getSource().equals(btnA))
System.out.println("A was pressed");
}
}
我开始使用Java GUI。我有一个按钮。但是,当我单击该按钮时,第三个print语句不会执行,即使它应该是,从事件的toString()信息判断。怎么了?
答案 0 :(得分:8)
执行此行时,您将声明一个局部变量:
JButton btnA=new JButton("A");
成员字段btnA
仍然未初始化。将行更改为:
btnA=new JButton("A");
(顺便说一句,这里有一个安全的例子 - 甚至可能更明确地表达你的意图 - 使用==
代替调用equals()
。)
答案 1 :(得分:4)
您没有在构造函数中使用实例变量btnA,而是使用局部变量btnA。这意味着你的实例变量btnA仍然是空的。
来自actionPerformed的btnA将为null。
答案 2 :(得分:2)
以下声明:
JButton btnA=new JButton("A");
为您的班级成员btnA
添加阴影。替换为:
btnA=new JButton("A"); // Without the type declaration
答案 3 :(得分:2)
JButton btnA=new JButton("A");
这个范围只在构造函数中。所以在actionPerformed函数
将其更改为
btnA=new JButton("A");