簡體   English   中英

來自另一個 class 的 JButton 的 ActionListener 未觸發

[英]ActionListener for JButton from another class not triggering

我的主要 class 帶有 static CardLayout JPanel,其中包括來自 Home class 的 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;
}

我的另一個 class 沒有觸發 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 的 static 實現的另一個問題,是否有一種非靜態的方式來完成同樣的事情(顯示的 JPanel 可以由外部類的組件控制)?

我的其他 class JButton 的動作監聽器沒有被觸發

在修復代碼以便編譯之后,對我來說工作正常。 請參閱您最初問題的評論。

是否有一種非靜態的方式來完成同樣的事情(顯示的 JPanel 可以由外部類的組件控制)?

首先,去掉方法上的 static 關鍵字。

然后你有幾個選擇:

  1. 將 Runner1 class 的引用傳遞給每個子面板。
  2. 在子面板中,您可以使用getParent()方法獲取對 Runner1 class 的引用。

獲得參考后,您可以參考 Runner1 class 中的任何方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM