首页 > 解决方案 > 来自另一个类的 JButton 的 ActionListener 未触发

问题描述

我的主类有一个静态 CardLayout JPanel,其中包括 Home 类的一个 JPanel。

import java.awt.*;
import javax.swing.*;

public class Runner1 extends JPanel{

    public Runner1() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new CardLayout());

        pnlHome = new Home();
        pnlSignIn = new SignIn();
        add(pnlHome, "Home");
        add(pnlSignIn, "SignIn");
    }

    public static void showJPanel(String s) {
        CardLayout cl = (CardLayout) (pnlRunner.getLayout());
        cl.show(pnlRunner, s);
    }
    
    public static void createAndShowGUI(){
        pnlRunner = new Runner1();
        
        JFrame frame = new JFrame();
        frame.setTitle("Delivery System");
        frame.setSize(new Dimension(500, 400));
        frame.getContentPane().add(pnlRunner);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    public static Runner1 pnlRunner;
    private JPanel pnlHome;
    private JPanel pnlSignIn;
}

我的另一个类,其中 JButton 的动作侦听器没有被触发,在调试时,btnNewOrderActionPerformed 没有被执行。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Home extends JPanel  {
    public Home() {
        initComponents();
    }
    
    private void initComponents(){
        
        setLayout(new BorderLayout());
        
        add(new TextArea("Active Orders"),BorderLayout.CENTER);
        
        JButton btnNewOrder1 = new JButton("New Order");
        btnNewOrder1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                btnNewOrderActionPerformed(e);
            }
        });
        add(btnNewOrder1, BorderLayout.PAGE_END);
    }
    
    private void btnNewOrderActionPerformed(ActionEvent e){
        System.out.println("test");
    }
    
    private OrderMap[] JOrders; //Lists of JPanel of orders
    private JButton btnNewOrder;
}

关于 CardLayout JPanel 的静态实现的另一个问题,是否有一种非静态的方式来完成相同的事情(显示的 JPanel 可以由外部类的组件控制)?

标签: javaswing

解决方案


我的另一个类,其中 JButton 的动作侦听器没有被触发

在修复代码以便编译之后,对我来说工作正常。请参阅您最初问题的评论。

是否有一种非静态的方式来完成同样的事情(显示的 JPanel 可以由外部类的组件控制)?

首先,去掉方法上的 static 关键字。

然后你有几个选择:

  1. 将 Runner1 类的引用传递给每个子面板。
  2. 在子面板中,您可以使用该getParent()方法获取对 Runner1 类的引用。

一旦有了引用,您就可以引用 Runner1 类中的任何方法。


推荐阅读