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()信息判断它应该执行。有什么问题吗?
在执行这一行时声明了一个局部变量:
JButton btnA=new JButton("A");
成员字段btnA
保持未初始化状态。将行改为:
btnA=new JButton("A");
(顺便说一下,这里有一个安全的情况-甚至可能更清楚地表达您的意图-使用==
而不是调用equals()
。)
在构造函数中使用的不是实例变量btnA,而是局部变量btnA。这意味着你的实例变量btnA将仍然为空。
actionPerformed中的btnA将为null
以下语句:
JButton btnA=new JButton("A");
显示类成员btnA
。将其替换为:
btnA=new JButton("A"); // Without the type declaration
JButton btnA=new JButton("A");
,此操作的范围仅在构造函数中。所以它在actionPerformed函数
改为
btnA=new JButton("A");