java – 没有在扩展JPanel的类内调用ActionListener

前端之家收集整理的这篇文章主要介绍了java – 没有在扩展JPanel的类内调用ActionListener前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个名为FrontGUI的主框架,并添加了一个侧面板.这个侧面板是一个名为FrontGUILinker的类,它扩展了JPanel,并在其上有一个按钮.当我运行程序时,按钮不会执行任何操作 – 似乎似乎没有调用ActionListener.我有其他几个具有类似设置的组件,按钮都可以使用它们 – 唯一的区别是我们可以看到它们是JFrame的扩展,它们不是FrontGUI的直接字段,而是代替下面代码中提到的maingui .这个maingui包含每个帧的Controller类,包括FrontGUIController,但FrontGUILinkerController是FrontGUIController中的一个字段.以下是我班级的概述,希望只是遗漏了无关的事情.主要的JFrame类:

  1. public class FrontGUI extends JFrame {
  2. public FrontGUILinker linkerPanel;
  3. public JButton btnShowhideLinker;
  4. public FrontGUI() {
  5. linkerPanel = new FrontGUILinker();
  6. contentPane.add(linkerPanel,BorderLayout.EAST);
  7. btnShowhideLinker = new JButton("Show/Hide Linker");
  8. contentPane.add(btnShowhideLinker);
  9. }
  10. }

这是它的“控制器”类.侧面板可以显示不显示,这是这个动作监听器所做的,这似乎工作得很好.

  1. public class FrontGUIController {
  2. public MAINGUI maingui;
  3. private FrontGUI frame;
  4. public FrontGUILinkerController linkerController;
  5. public FrontGUIController(MAINGUI parent) {
  6. maingui = parent;
  7. frame = new FrontGUI();
  8. linkerController = new FrontGUILinkerController(maingui);
  9. //Button: Show/Hide linkerPanel
  10. frame.btnShowhideLinker.addActionListener( new ActionListener() {
  11. @Override
  12. public void actionPerformed(ActionEvent arg0) {
  13. frame.linkerPanel.setVisible(!frame.linkerPanel.isVisible());
  14. }});
  15. }
  16. }

这是FrontGUILinker类:

  1. public class FrontGUILinker extends JPanel {
  2. public btnCreateLink;
  3. public FrontGUILinker() {
  4. btnCreateLink = new JButton("Create Link");
  5. add(btnCreateLink);
  6. }
  7. }

这是该类的控制器:

  1. public class FrontGUILinkerController {
  2. public MAINGUI maingui;
  3. private FrontGUILinker frame;
  4. public FrontGUILinkerController(MAINGUI parent) {
  5. maingui = parent;
  6. frame = new FrontGUILinker();
  7. // Add listener to Create Link button
  8. frame.btnCreateLink.addActionListener( new ActionListener() {
  9. @Override
  10. public void actionPerformed(ActionEvent arg0) {
  11. System.out.println("Create Link button has been clicked");
  12. }});
  13. }
  14. }

任何人都知道为什么这不起作用?

最佳答案
您正在创建两次FrontGUILinker实例,一个是您正在显示的,另一个是您要添加一个ActionListener.不要那样做.创建此对象一次,并对两者使用相同的引用.要证明我是对的,只需查看上面问题中的代码,然后搜索调用新FrontGUILinker()的位置,你就会看到你做了两次,这里:

  1. public FrontGUI() {
  2. linkerPanel = new FrontGUILinker();

再来一次:

  1. public FrontGUILinkerController(MAINGUI parent) {
  2. maingui = parent;
  3. frame = new FrontGUILinker();

每个实例都与另一个实例完全不同,因此向一个实例添加一个ActionListener对另一个实例(显示的实例)没有任何影响.要解决此问题,请将有效引用传递到需要的位置.

即,

  1. public class FrontGUILinkerController {
  2. public MAINGUI maingui;
  3. private FrontGUILinker frame;
  4. // **** note change
  5. public FrontGUILinkerController(MAINGUI parent,FrontGUILiner frame) {
  6. maingui = parent;
  7. this.frame = frame; // **** added
  8. // frame = new FrontGUILinker(); // **** commented out
  9. // Add listener to Create Link button
  10. frame.btnCreateLink.addActionListener( new ActionListener() {
  11. @Override
  12. public void actionPerformed(ActionEvent arg0) {
  13. System.out.println("Create Link button has been clicked");
  14. }});
  15. }
  16. }

  1. public FrontGUIController(MAINGUI parent) {
  2. maingui = parent;
  3. frame = new FrontGUI();
  4. linkerController = new FrontGUILinkerController(maingui,frame); // **** changed

猜你在找的Java相关文章