JPanel ActionsListener 中的 Java 按钮不起作用

标签 java swing actionlistener

我有以下问题:我有一个小应用程序,具有非常简单的 UI 和在另一个类中实现的操作监听器,这是代码

public class PruebaEvento {

    public static void main(String[] args) {
        Frame frame = new Frame();
        Panel panel = new Panel();
        Controller c = new Controller(panel);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

框架

class Frame extends JFrame{

    public Frame() {
        setBounds(600, 250, 600, 300);
        Panel mipanel = new Panel();
        add(mipanel);

    }
}

面板

class Panel extends JPanel{

    public javax.swing.JButton btn = new javax.swing.JButton("Subir archivo");

    public Panel() {
        add(btn);
    }

}

Controller

class Controller implements ActionListener{

    Panel panel = new Panel();
    public Controller(Panel panel) {
         this.panel=panel;
         panel.btn.addActionListener(this);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //not working
    }
}

不知道为什么不起作用

最佳答案

您已经创建了 3 个 Panel 对象,其中一个添加到 JFrame 并且可见,还有一个单独的,您发送到 Controller ,该对象< em>不可见,并且在 Controller 内部创建了第三个(看看您调用new Panel()的次数)。不要这样做。创建一个单独的 Panel 对象,该对象既添加到可见的 GUI,又连接到 Controller 。

例如,

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

public class PruebaEvento {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Frame frame = new Frame();
            Panel panel = new Panel();
            frame.add(panel);
            Controller c = new Controller(panel);

            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        });
    }
}
class Frame extends JFrame {

    public Frame() {
        setBounds(600, 250, 600, 300);

        // ****** don't create a new Panel here *****
        // Panel mipanel = new Panel();
        // add(mipanel);

    }
}
class Panel extends JPanel {

    public javax.swing.JButton btn = new javax.swing.JButton("Subir archivo");

    public Panel() {
        add(btn);
    }

}
class Controller implements ActionListener {

    Panel panel;

    public Controller(Panel panel) {
        this.panel = panel;
        panel.btn.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("working");
    }
}
<小时/>

旁注:

最好不要通过公共(public)字段直接向外界公开您的字段,而是将它们设为私有(private),仅公开需要公开的字段。在这种情况下,请考虑创建一个公共(public)方法以允许 Controller 添加监听器。例如:

class Panel extends JPanel {

    private javax.swing.JButton btn = new javax.swing.JButton("Subir archivo");

    public Panel() {
        add(btn);
    }

    public void addBtnListener(ActionListener l) {
        btn.addActionListener(l);  // !!
    }

}
class Controller implements ActionListener {

    Panel panel;

    public Controller(Panel panel) {
        this.panel = panel;
        // panel.btn.addActionListener(this);
        panel.addBtnListener(this); // !! 
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("working");
    }
}

关于JPanel ActionsListener 中的 Java 按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59801761/

相关文章:

java - paintComponent 在我的绘图之上绘制其他组件

java - actionPerformed 跳过一步

JButton 上的 Java Actionlistener 没有名称?

java - 使用混合数据类型将数据结构初始化为常量值

java - 使用maven创建.war文件,如何使用我的生产资源?

java - JComboxBox setSelectedItem

java - JTable 将 boolean 值渲染为 JToggleButton

java - Jbutton 没有清除我的文本字段

java - 在继承中,基类构造函数调用虚方法,为什么类是派生类并调用派生方法?

java - 使用递归查找列表中的重复项?