Java 无法从其他类添加actionlistener

Java 无法从其他类添加actionlistener,java,swing,actionlistener,Java,Swing,Actionlistener,似乎我完全不明白这些东西是如何工作的……我有一个扩展JPanel并实现Actionlistener的类,然后我想将它添加到一个扩展JFrame的类中……我无法让它工作 public class testPanel extends JFrame implements ActionListener{ JButton someBtn; public testPanel(JButton someBtn){ this.someBtn = someBtn; add(someBtn);

似乎我完全不明白这些东西是如何工作的……我有一个扩展JPanel并实现Actionlistener的类,然后我想将它添加到一个扩展JFrame的类中……我无法让它工作

public class testPanel extends JFrame implements ActionListener{
JButton someBtn;

public testPanel(JButton someBtn){
    this.someBtn = someBtn;
    add(someBtn);
    someBtn.addActionListener(this);

}

@Override
public void actionPerformed(ActionEvent e){
    if(e.getSource() == someBtn)
        System.out.println("this worked");
}

}
二等档案

public class JavaApplication3 extends JFrame{

/**
 * @param args the command line arguments
 */
JButton button;

public JavaApplication3(){
    super("blah");
    JFrame p = new testPanel(button);
    add(p);
    pack();
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    // TODO code application logic here
    new JavaApplication3();
}
}

testPanel
中的这一行肯定会引发异常:

add(someBtn);
由于引用
someBtn
为空

您从未在
JavaApplication3
类中初始化
按钮
实例变量,bzut在
testPanel
类的构造函数中使用了该变量

但是,您希望得到此流的相反结果:

  • 测试面板
    类中创建按钮
  • 如果您想从
    JavaApplication3
    类获取引用,那么您需要在testPanel类中使用getter
  • 例如:

    public class testPanel extends JFrame implements ActionListener{
        JButton someBtn; //consider using private
    
        public testPanel(){
            this.someBtn = new JButton(); //add correct constructor here
            add(someBtn);
            someBtn.addActionListener(this);
        }
    
        public JButton getSomeBtn() {
            reeturn someBtn;
        }
    //... rest comes here
    }
    
    
    
    public class JavaApplication3 extends JFrame{
    
        JButton button;
    
        public JavaApplication3(){
            super("blah");
            JFrame p = new testPanel();
            button  = p.getSomeBtn(); //this is the important line
            add(p);
            pack();
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        //... rest comes here    
    }
    

    旁注:使用Java命名约定:类名以大写字母开头…

    您还没有初始化button实例变量…通常您希望包含您得到的实际错误。您的示例无法工作,两个类都从JFrame扩展