簡體   English   中英

按鈕ActionListener未在擴展JPanel的類內部調用

[英]Button ActionListener not called inside class extending JPanel

我有一個名為FrontGUI的主框架,並添加了一個側面板。 這個側面板是一個名為FrontGUILinker的類,它擴展了JPanel,並在其上有一個按鈕。 當我運行程序時,按鈕不會執行任何操作 - 似乎似乎沒有調用ActionListener。 我有其他幾個具有類似設置的組件,按鈕都可以使用它們 - 唯一的區別是我們可以看到它們是JFrame的擴展,它們不是FrontGUI的直接字段,而是代替下面代碼中提到的maingui 。 這個maingui包含每個幀的Controller類,包括FrontGUIController,但FrontGUILinkerController是FrontGUIController中的一個字段。 以下是我班級的概述,希望只是遺漏了無關的事情。 主要的JFrame類:

public class FrontGUI extends JFrame {
    public FrontGUILinker linkerPanel;
    public JButton btnShowhideLinker;

    public FrontGUI() {
      linkerPanel = new FrontGUILinker();
      contentPane.add(linkerPanel, BorderLayout.EAST);

      btnShowhideLinker = new JButton("Show/Hide Linker");
      contentPane.add(btnShowhideLinker);
    }
}

這是它的“控制器”類。 側面板可以顯示或不顯示,這是這個動作監聽器所做的,這似乎工作得很好。

public class FrontGUIController {
    public MAINGUI maingui;
    private FrontGUI frame;
    public FrontGUILinkerController linkerController;

    public FrontGUIController(MAINGUI parent) {
       maingui = parent;
       frame = new FrontGUI();
       linkerController = new FrontGUILinkerController(maingui);

       //Button: Show/Hide linkerPanel
       frame.btnShowhideLinker.addActionListener( new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent arg0) {
           frame.linkerPanel.setVisible(!frame.linkerPanel.isVisible());
       }});

    }

}

這是FrontGUILinker類:

public class FrontGUILinker extends JPanel {
   public btnCreateLink;

   public FrontGUILinker() {
       btnCreateLink = new JButton("Create Link");
       add(btnCreateLink);
   }
}

這是該類的控制器:

public class FrontGUILinkerController {
   public MAINGUI maingui;
   private FrontGUILinker frame;

   public FrontGUILinkerController(MAINGUI parent) {
      maingui = parent;
      frame = new FrontGUILinker();

      // Add listener to Create Link button
      frame.btnCreateLink.addActionListener( new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
             System.out.println("Create Link button has been clicked");
         }});
   }
}

任何人都知道為什么這不起作用?

您正在創建兩次 FrontGUILinker實例,一個是您正在顯示的,另一個是您要添加一個ActionListener。 不要那樣做。 創建此對象一次,並對兩者使用相同的引用。 要證明我是對的,只需查看上面問題中的代碼,然后搜索你調用new FrontGUILinker() ,你就會看到你做了兩次,這里:

public FrontGUI() {
  linkerPanel = new FrontGUILinker();

再來一次:

public FrontGUILinkerController(MAINGUI parent) {
  maingui = parent;
  frame = new FrontGUILinker();

每個實例都與另一個實例完全不同,因此向一個實例添加一個ActionListener對另一個實例(顯示的實例)沒有任何影響。 要解決此問題,請將有效引用傳遞到需要的位置。

public class FrontGUILinkerController {
   public MAINGUI maingui;
   private FrontGUILinker frame;

   // **** note change
   public FrontGUILinkerController(MAINGUI parent, FrontGUILiner frame) {
      maingui = parent;
      this.frame = frame;  // **** added
      // frame = new FrontGUILinker(); // **** commented out

      // Add listener to Create Link button
      frame.btnCreateLink.addActionListener( new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
             System.out.println("Create Link button has been clicked");
         }});
   }
}

public FrontGUIController(MAINGUI parent) {
   maingui = parent;
   frame = new FrontGUI();
   linkerController = new FrontGUILinkerController(maingui, frame); // **** changed

暫無
暫無

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

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