/ / Comunicación entre JFrame y JPanel - java, swing, jframe, jpanel

Comunicación entre JFrame y JPanel - java, swing, jframe, jpanel

He creado JFrame usando JFrame Form en NetBeans. En este JFrame tengo JPanel con el segundo JPanel anidado. Luego tengo clases separadas de JPanel (he extendido JPanel).

Quiero usar este JPanel separado como el anidado en el JFrame. Cuando hago clic en un JButton quiero notificar al JFrame que se hizo clic en el botón.

Hasta ahora he conseguido gestionar el JPanel separado para el JFrame utilizando lo siguiente en el initComponents() de la JFrame:

nestedPanel = new separateJPanel

Pero ahora no tengo idea de cómo enviar información en la que se ha hecho clic en el botón.

¿Algún consejo de cómo puedo lograr esto?

Respuestas

3 para la respuesta № 1

Una forma simple es dar a su clase JPanel un método de delegación que permita a otras clases agregar ActionListeners al botón de interés. Por ejemplo:

public void addButton1ActionListener(ActionListener listener) {
button1.addActionListener(listener);
}

De esta manera, si el JFrame contiene una instancia del JPanel, puede llamar a este método para pasar un oyente al JButton. Por ejemplo:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo {
private static void createAndShowGui() {
Frame1 frame = new Frame1();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

// I almost never extend JFrame
class Frame1 extends JFrame {
private Panel1 panel1 = new Panel1();
private JLabel label = new JLabel(" ", SwingConstants.CENTER);

public Frame1() {
super("Foo");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
add(panel1, BorderLayout.CENTER);
add(label, BorderLayout.SOUTH);
pack();
setLocationByPlatform(true);

panel1.addButton1ActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
label.setText("Button pressed");
}
});
}
}

class Panel1 extends JPanel {
private JButton button1 = new JButton("Button");

public Panel1() {
add(button1);
}

public void addButton1ActionListener(ActionListener listener) {
button1.addActionListener(listener);
}
}

Tenga en cuenta que esta solución está bien para juguetes simplesprogramas, pero si su idea es crear una verdadera aplicación a gran escala, esto no se escalará bien ya que aumenta el acoplamiento de su código y disminuye la cohesión. Mucho mejor en esta situación sería esforzarse por crear un programa que use un Modelo-vista-control o arquitectura MCV.


4 para la respuesta № 2

Puede asignar al marco un atributo de panel y al panel un atributo de marco para unirlos en la memoria. De esta manera, puede pasar fácilmente datos a través de campos de instancia entre sí.

public MyPanel extends JPanel {

MyFrame frame;

MyPanel(MyFrame frame) {
this.panel = panel;
}
}