我有以下问题:我有一个小应用程序,具有非常简单的 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/