Вы создали 3 объекта Panel, один из которых добавлен в JFrame и который является видимым, и отдельный , который вы отправляете контроллеру, который не видимый и третий созданный внутри контроллера (посмотрите, сколько раз вы звоните new Panel()
). Не делай этого. Создайте один объект Panel, который добавляется к видимому GUI и подключается к контроллеру.
Например,
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");
}
}
Примечание:
Лучше не открывать свои поля миру через публичные c поля, а вместо этого делать их приватными, выставляя только то, что нужно раскрыть. В этой ситуации рассмотрите возможность создания метода publi c, чтобы контроллер мог добавить прослушиватель. Например:
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");
}
}