繁体   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