sk2ck:
Via codigo, cada vez que vou exibindo um jpanel, adiciono-o no jpanel principal.
Se você está adicionando o painel cada vez que for exibí-lo, você não está usando os "poderes" do CardLayout.
Imagine os paineis adicionados ao CardLayout como se fossem uma pilha de cartas. Por exemplo, se eu já tenho um dez de copas no meio da pilha de cartas, eu não preciso pegar outro dez de copas e adicionar a pilha novamente, eu preciso procurar o dez de copas que já está na pilha e colocá-lo no topo para que fique visível.
Exemplo prático:
Os paineis são criados e adicionados ao CardLayout uma única vez:
// Criação dos paineis
JPanel pane1 = ...
JPanel pane2 = ...
JPanel pane3 = ...
JPanel pane4 = ...
JPanel cardPane = new JPanel(new CardLayout);
cardPane.add(pane1, "pane1");
cardPane.add(pane2, "pane2");
cardPane.add(pane3, "pane3");
cardPane.add(pane4, "pane4");
. . .
A partir deste momento, os paineis já estão na "pilha de cartas", portanto não é mais necessário adicioná-los novamente, só é preciso usar os métodos de navegação (first, last, next, previous e show) para definir qual deles ficará visível para o usuário.
sk2ck:
Minha duvida portanto seria se fazendo essas adições meu programa não ficaria muito pesado? Ou se quando eu alterno entre jpanel o java faz a limpeza?
Adicionar paineis exageradamente vai ter custo sim para memória e o GC não fará a limpeza, pois a referência dos paineis ficam guardados no Container e no próprio CardLayout, a não ser que o painel seja explicitamente removido do Container. Mas se usar da forma correta não precisa se preocupar, porque quando alternar os paineis não serão criados novos objetos.