Ola estou com o seguinte problema tenho um painel que chama outro painel de outra classe, como posso fechar este painel que foi chamado atraves do mesmo painel que o chamou?
exemplo
O PainelA chama o PainelB através de um botão.
Como fechar o PainelB através deste mesmo botão?
este é o PainelA
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PainelA extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton AbrirFecharPainel = null;
private int a;
public PainelA() {
super();
initialize();
}
private void initialize() {
this.setSize(446, 243);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getAbrirFecharPainel(), null);
}
return jContentPane;
}
private JButton getAbrirFecharPainel() {
if (AbrirFecharPainel == null) {
AbrirFecharPainel = new JButton();
AbrirFecharPainel.setBounds(new Rectangle(168, 61, 113, 56));
AbrirFecharPainel.setText("ABRIR");
AbrirFecharPainel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(a==0){
a=1;
AbrirFecharPainel.setText("FECHAR");
PainelB abrir = new PainelB();
abrir.setVisible(true);
}
else{
a=0;
AbrirFecharPainel.setText("ABRIR");
}
}
});
}
return AbrirFecharPainel;
}
}
Aqui o PainelB
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PainelB extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
public PainelB() {
super();
initialize();
}
private void initialize() {
this.setSize(596, 222);
this.setBounds(300, 300, 452, 427);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
}
return jContentPane;
}
}
//PainelA
//Declare o PainelB como uma variável de classe
private PainelB b;
public void actionPerformed(ActionEvent e){
if(AbrirFecharPainel.getText().equals("ABRIR)){
b = new PainelB();
b.setVisible(true);
AbrirFecharPainel.setText("FECHAR);
}else if(AbrirFecharPainel.getText().equals("FECHAR)){
//Como o PainelB é uma variável de classe e já foi instanciado, talvez isso funcione
b.setVisible(false);
AbrirFecharPainel.setText("ABRIR);
}
}
O todos esqueceram, [color=red]inclusive eu[/color], é que o método “getJContentPane()” é diferente do método getContentPane do JFrame, ou seja, o primeiro método é um método criado pelo usuário, no caso o nosso amigo Tiora.
De qualquer forma, voce tem que adicionar o panel dentro JFrame através do seu método “add(Component comp)” ou “getContentPane().add(Component comp)” e ao meu ver não precisaria criar aquele método lá de cima (getJContentPane()), pois voce pode adicionar ou remover o componente com o getContentPane() do JFrame, de seguinte maneira:
if(AbrirFecharPainel.getText().equals("ABRIR)){
b = new PainelB();
getContentPane().add(b);
AbrirFecharPainel.setText("FECHAR);
}else if(AbrirFecharPainel.getText().equals("FECHAR)){
//Como o PainelB é uma variável de classe e já foi instanciado, talvez isso funcione
getContentPane().remove(b);
b.dispose();
b = null;
AbrirFecharPainel.setText("ABRIR);
}
// O ideal seria este:
if (b == null) {
b = new PainelB();
getContentPane().add(b);
} else {
getContentPane().remove(b);
b.dispose();
b = null;
}
Quando voce adiciona qualquer componente ao JFrame, este passa ser o Container de todos os componentes inseridos dentro de sua interface, sendo o JFrame responsável pela visualização de todos os componentes inseridos nele, dando automaticamente um “setVisible(true)” em todos, bem como, fica também responsável por tirar o componente da tela no ato de sua remoção, assim sendo voce não precisa ficar setando o setVisible(true) a toda hora.
Cara fiz o que o amigo " drsmachado" e deu certinho declarei o painelB como uma variavel de classe e acrescentei “pb=null” pois queria que a cada clique ele abrice e o outro clique ele fechasse. Muito bom obrigado pessoal .