JFrame, JPanel e JButton

Vou direto ao problema, tenho um JFrame que vai abrir com um JPanel inicial que seria o panel principal e que tem 2 JButton, um para mudar o JPanel que vai possuir outros JButtons e um que todo panel vai ter, que é o JButton “Sair”, nos outros panels ele só vai voltar pro panel anterior, enquanto que o do panel inicial vai encerrar a aplicação, agr vem os dois problemas:

Primeiro:
—> To tendo problemas com o JFrame para fazer a mudança de panels, aqui vai o codigo da parte que ta dando problema, de resto é o que faz normalmente pra add um panels no frame:

public void mudarPanel(JPanel panel) {
   frame.removeAll();
   frame.add(panel);
   frame.repaint();
}

Segundo:
—> Como faço para o botao fechar a aplicação?

System.exit(0);

isso seria oq?

Detalhes

a sim, isso é resposta do meu segundo problema, obg :smiley:
agr só falta alguém souber responder o meu primeiro problema

Qual o tipo de problema?

ele da um erro na linha:

frame.removeAll();

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

Qual é o frame?
Se o frame é a instância do objeto corrente, utilize this

this.removeAll();

o frame eu instanciei dentro da classe, ta assim

class ClasseComFrame {
 JFrame frame = new JFrame();
 //Todo o codigo, blablabla...
 public void mudarPanel(JPanel panel) {
  frame.removeAll();
  frame.add(panel);
  frame.repaint();
 }
}

Esse exemplo é mais ou menos isso, ele tem o JFrame dentro da classe

Então, garanta que é o JFrame em questão, talvez, utilizando o this.frame.

tem alguma forma que eu possa usar pra tirar somente o panel? tipo, tem uns .remove() pra usar no frame, mas eu não entendi como eles funcionam

Resolvi o meu primeiro problema, a linha tava errada, o correto era:

frame.getContentPane().removeAll();

dessa forma ele limpa o conteiner ContentPane.

Ocorreu um terceiro problema, agr quando eu mudo o Painel ele não aparece os JButtons do segundo painel, só aparecem quando eu redimensiono a Frame, ai sempre aparece.
O que poderia ser?

Isso geralmente acontece quando o layout é nulo, poderia tentar dar um repaint, mas o correto seria colocar um layout.

hm, eu tinha colocado e layout nulo, e agr eu tirei, mas continua dando problema e ainda ele fica redimensionando os paineis, o primeiro ele coloca todo o frame e o outro ele dimensiona um pouco menor mas não do tamanho que tinha que ser

O problema é o layout escolhido, geralmente os layouts preenchem todo o componente (frame ou panel).

Provavelmente o tamanho dos painéis são diferentes, tem três opções:

1- Depois do add, adicione o pack, isso poderá redimensionar o frame:

  frame.add(panel);
  frame.pack();
  // frame.repaint(); // desnecessário

2- Use um JScrollPane:

  // incluir onde o frame é construido
  JScrollPane root = new JScrollPane();
  frame.add(root);

  // troca os painéis, não é necessário remover o anterior
  root.setViewportView(panel);

3- Definir o mesmo tamanho dos painéis.

o, vou tentar fazer isso, mas só pra deixar claro, todos os paineis tem o mesmo tamanho pois todos herdam da classe pai que é extendido do JPane e que em seu construtor eu defini um tamanho(isso pq cada panel é uma classe diferente, para facilitar as configuracoes individuais de cada)

Com esse root eu posso tirar o frame.removeAll()? e é só colocar essas linhas?

Como eu faço para os panels terem o tamanho pre definido neles?

Sim, pois agora não seria mais no frame que seria feita a troca. O JScrollPane sempre remove o anterior pois só funciona com um panel, portanto não é necessário o removeAll, mas se não for o JScrollPane é necessário o remover antes de colocar.

Dimension d = new Dimension(300, 300);
panel.setPreferredSize(d);
panel.setMinimumSize(d);
panel.setMaximumSize(d);

mas depende do layout.

é que agr o panel ta espalhado pelo frame todo, ele não ta na diemnsão que eu defini na classe dele.

O melhor seria se eu podesse fazer setLayout(null)

Conseguir resolver, fiz uma busca mais demorada sobre como resolver o problema dos componentes sumindo, então encontrei um comentário que listou alguns tipos de problemas que podiam ocorrer, e um que me chamou a atenção foi ele dizer que podia ser a falta do metodo .validate(), eu tinha reparado que algumas pessoas usavam ele em seus códigos, mas não fazia idéia do pq, então dei uma lida pra que serve mas não entendi muito bem, pelo que eu entendi, ele valida o tamanho dos componentes que estão inseridos, me corrijam se eu estiver errado rsrs, to aprendendo ainda :smiley:

foi nesse link, o cara tava tendo um problema semelhante ao meu:

http://javafree.uol.com.br/topic-871899-Swing-objetos-que-somem.html