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 № 1Uma 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;
}
}