Pessoal… tava aqui tendo um pouco de reflexão a respeito dos dois metodos na hora de definir um panel no JFrame.
Vamos supor:
JPanel panel = new JPanel();
JButton botao = new JButton("Botao");
panel.add(botao);
setContentPane(panel); //Linha Importante
setVisible(true);
pack();
e…
JPanel panel = new JPanel();
JButton botao = new JButton("Botao");
panel.add(botao);
getContentPane().add(panel); //Linha Importante
setVisible(true);
pack();
Eu sempre usei do primeiro modo, mas agora tava lendo o tutorial aqui do GUJ sobre Swing, e vi que o exemplo estava assim. Pesquisei no forum, e parece que o mais “normal” é fazer dessa segunda maneira.
Bom, acompanhem meu raciocinio:
Sempre usei da primeira forma(antes de mais nada porque era a unica que eu conhecia), mas me fazia bastante sentido o JFrame vir “oco”, e eu vou lá e “colo” um JPanel nele com os seus componentes jah devidamente configurados.
Na segunda forma tudo bem, também da para intender: eu pego o Conteiner(E esse conteiner é o que? Um JPanel?) e adiciono componentes a ele. Só que eu achei estranho o “add”(adiciona), quer dizer que posso colocar mais de um JPanel ali por exemplo? Eu testei aqui, mas nao deu certo, só aparece o primeiro JPanel(e seus componentes) que eu adicionei. Eu esperava q se eu adicionasse dois JPanels ficasse 2 panels um do lado do outro meio da mesma forma que fossem dois componentes dentro de um panel com FlowLayout(ou qualquer outro layout).
Em fim, minha duvida exatamente é: Qual a diferença dos dois “modos”? Porque se deve usar um e não outro? Ou pra que serve um, e pra q serve o outro? Qual a vantagem de um pro outro?
Em fim, sou novato no Java, mas sempre que eu acho uma questão filosófica dessas eu fico me martelando. xD
Obrigado desde já!
tambem sou novato, mas vamos dizer que ele ja não venha “oco” , tem la um contentPane pronto pra ser usado que foi criado pelo construtor da classe pra facilitar ja que o swing requer um JComponent opaco pra fazer suas pinturas, que tu acessa ele atraves do getContentPane , enquanto ao usar o set tu so ta descartando o atual que ja tem por um novo componente…
então não tem melhor, mas se ja tem um lá porque não usar ele ? =p
e voce pode sim adicionar mais de um componente nesse contentpane pane atraves do getContentPane.add()
é so fazer assim por ex:
this.getContentPane().add(p1,BorderLayout.NORTH);
this.getContentPane().add(p2,BorderLayout.SOUTH);
da pra setar outros layouts tambem… acho que é atraves do
this.getContentPane().setLayout();
sobre o add pode olhar aqui:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Container.html#addImpl(java.awt.Component,%20java.lang.Object,%20int)
esse metodo addImpl e o metodo que o add chama…
ou intao ve pelo add mesmo as opções possiveis…
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Container.html#add(java.awt.Component)
flw.
Opa, agora deu uma clareada aqui na minha cabeça. Eu ja tava fazendo confusão. xD
De fato só temos um ContentPane, o que temos mais de um(ou não) são os componentes que adicionamos no ContentPane. Eu tava olhando o “add”, e na minha cabeça eu ja tava adicionando mais de um ContentPane, enquanto na verdade são os componentes dele que eu estou adicionando. Viajei. 
Vlw pela ajuda WillyKocher, mas ainda me restou uma duvida, que agora é mais de curiosidade.
Quando usamos o getContentPane do JFrame, ele nos retorna um objeto Container(o que provavelmente foi definido no construtor do JFrame). Mas é um objeto do tipo Container mesmo? Ou de algum dos seus subtipos?
Obrigado e boa noite!
o metodo no JFrame de acordo com o java doc é:
public Container getContentPane()
então retornaria um Container ou subclasse não da pra saber…
mas pelo que li na API tambem, no metodo setContentPane() ele fala…
Swing’s painting architecture requires an opaque JComponent in the containment hiearchy. This is typically provided by the content pane. If you replace the content pane it is recommended you replace it with an opaque JComponent.
bom se ele recomenda usar um JComponente se alterar o contentPane , acredito eu que ele deve retornar um JComponente mesmo, que seria uma subclasse direta de um Container…
agora saber… saber mesmo eu não sei acho que daria pra fazer um teste pegando o retorno do getContentPane() e fazendo um instanceof JComponent , agora se for uma subclasse + baixa ainda por algum motivo eu não sei nem qual seria…