/ / Comunicação entre JFrame e JPanel - java, swing, jframe, jpanel

Comunicação entre JFrame e JPanel - java, swing, jframe, jpanel

Eu criei o JFrame usando o formulário JFrame no NetBeans. Neste JFrame eu tenho JPanel com o segundo JPanel aninhado. Então eu tenho uma classe JPanel separada (eu estendi o JPanel).

Eu quero usar este JPanel separado como o aninhado no JFrame. Quando clico em um JButton, quero notificar o JFrame de que o botão foi clicado.

Até agora eu tenho managet para obter o JPanel separado para o JFrame usando o seguinte no initComponents() do JFrame:

nestedPanel = new separateJPanel

Mas agora não tenho idéia de como enviar informações de que o botão foi clicado.

Alguma dica de como posso conseguir isso?

Respostas:

3 para resposta № 1

Uma maneira simples é dar à sua classe JPanel um método de delegação que permita que outras classes adicionem ActionListeners ao botão de interesse. Por exemplo:

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

Dessa forma, se o JFrame contiver uma instância do JPanel, ele poderá chamar esse método para passar um listener para o JButton. Por exemplo:

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);
}
}

Note que esta solução é boa para o brinquedo simplesprogramas, mas se a sua idéia é criar uma verdadeira aplicação em grande escala, isso não vai escalar bem, pois aumenta o acoplamento do seu código e diminui a coesão. Muito melhor nesta situação seria se esforçar para criar um programa que usa um mais Arquitetura Model-View-Control ou MCV.


4 para resposta № 2

Você pode atribuir ao quadro um atributo de painel e ao painel um atributo de quadro para vinculá-los na memória. Desta forma, você pode facilmente passar dados através de campos de instância para o outro.

public MyPanel extends JPanel {

MyFrame frame;

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