Preciso criar alguns JPanel automaticamente e gostaria de alinha-los tbm automaticamente…vejam o codigo que estou usando.
intcount=0;JPanelpanel;panel=newJPanel();while(count<5){//criando jpanelspanel.setName("panel"+count++);panel.setBorder(BorderFactory.createTitledBorder("BevelBorder"));panel.setSize(104,104);jPanel1.add(panel);//adiciona os panel ao jPanel1 que ja esta criado.System.out.println(panel.getName());
Ao que tudo se parece, no System.out ele vai criando os panel para mim, porem esses panel naum saum alinhados…Como alinha-los automaticamente ???
Ja tentei usar setAlignmentX e Y, mas ainda naum tive resultados…Lembrando, que preciso que eles vao alinhando um do lado do outro até preencher a tela, e quando chegar no fim da tela ir sendo criados na parte de baixo um embaixo do lado do outro…
Salve Vini, obrigado pela atenção…Eu estou usando o NetBeans para criar a aplicação, estou pesquisando bastante sobre layout manager, mas ainda não encontrei algo q me ajude a resolver o problema…vou continuar ae nas pesquisas, se tiver alguma dica agradeço.
obrigado.
fernandopaiva
Opa Vini, veja o codigo.
intcount=1;JPanelpanel;panel=newJPanel();jPanel1.setLayout(newGridLayout());//seta gridlayout para jPanel1 que vai receber os panelwhile(count<5){panel.setName("panel"+count++);//cria os panelpanel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));panel.setSize(104,104);jPanel1.add(panel);System.out.println("Criando: "+panel.getName());//printa os panel sendo criados}jPanel1.repaint();//refaz jPanel1
Seguinte, com GridLayout naum estou conseguindo ainda o efeito de criar os panels uns do lado do outro e quando eu desenho 4 jPanel estatico e executo a aplicacao eles ficam como eu preciso.
obrigado novamente.
acromo
No construtor do GridLayout você deve passar o numero de linhas e colunas, por exemplo se você quiser 3 linhas por duas colunas:
new GridLayout(3, 2);
fernandopaiva
opa acromo, é muito estranho pq eu estou usando essa lógica ae para criar os jPanel, mas ainda naum estou tendo resultados…veja:
intcount=1;JPanelpanel;panel=newJPanel();jPanel1.setLayout(newGridLayout(10,10));//seta gridlayout para jPanel1 que vai receber os panel para 10 linhas e 10 colunas. while(count<5){panel.setName("panel"+count++);//cria os panel panel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));panel.setSize(104,104);jPanel1.add(panel);System.out.println("Criando: "+panel.getName());//printa os panel sendo criados }jPanel1.repaint();//refaz jPanel1
Essas linhas são disparadas por um evento de um jButton. No jPanel1 que é onde vai ser criado os outros jPanel eu consigo cria-los porem eles não se alinham, parece que fica um em cima do outro.
obrigado mais uma vez pela atenção.
Eric_Yuzo
O problema é que o mesmo painel está sendo adicionado 5 vezes, por isso a impressão de estar um em cima do outro.
while (count < 5){
panel = new JPanel(); //cria um novo panel
panel.setName("panel" + count++);
panel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
panel.setSize(104, 104);
jPanel1.add(panel);
System.out.println("Criando: " + panel.getName());
}
fernandopaiva
opa Eric, obrigado pela atenção…
Mas na lógica usada panel é criado varias vezes mas com nomes diferentes no while, veja:
e eles são adicionados ao jPanel1 a cada laço do while aqui.
jPanel1.add(panel);
e depois eu dou um repaint no jPanel1 para ele ser redesenhado fora do laco do while…aqui:
while(condicao){bloco}jPanel1.repaint();
ja tentei colocar o repaint() dentro do laco do while para ver se ele vai criando os panels e dando repaint, msm assim não funcionou ainda…
novamente, obrigado !
acromo
Como o Eric tinha comentado você esta utilizando o mesmo painel mesmo você setando um novo nome o objeto continua sendo o mesmo, faça como o Eric sugeriu para testar.
fernandopaiva
Acromo, eu ja fiz…mas ainda naum funcionou !
veja:
intcount=1;JPanelpanel;jPanel1.setLayout(newGridLayout(3,2));//seta gridlayout para jPanel1 que vai receber os panelwhile(count<5){panel=newJPanel();panel.setName("panel"+count++);//cria os panelpanel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));panel.setSize(104,104);jPanel1.add(panel);System.out.println("Criando: "+panel.getName());//printa os panel sendo criados }jPanel1.repaint();//refaz jPanel1
obrigado.
acromo
E como você esta adicionando este jPanel1 eu seu frame ou qualquer outro container
fernandopaiva
acromo, na linha
jPanel1.add(panel);
nessa linha ae eu add os novos panels ao jPanel1 que é o panel principal do jFrame…Veja o codigo todo que estou tentando.
intcount=1;JPanelpanel;jPanel1.setLayout(newGridLayout(3,2));//seta gridlayout para jPanel1 que vai receber os panelwhile(count<5){panel=newJPanel();panel.setName("panel"+count++);//cria os panelpanel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));panel.setSize(104,104);jPanel1.add(panel);//adiciona todos os jPanel criados a jPanel1 System.out.println("Criando: "+panel.getName());//printa os panel sendo criados }jPanel1.repaint();//refaz jPanel1
obrigado
acromo
Não tem como você postar sua classe inteira para verificar onde pode estar errado.
fernandopaiva
a classe é simples…veja.:
importjava.awt.GridLayout;importjavax.swing.BorderFactory;importjavax.swing.JPanel;publicclassNewJFrameextendsjavax.swing.JFrame{/** Creates new form NewJFrame */publicNewJFrame(){initComponents();}privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){// TODO add your handling code here:intcount=1;JPanelpanel;jPanel1.setLayout(newGridLayout(3,2));//seta gridlayout para jPanel1 que vai receber os panelwhile(count<5){panel=newJPanel();panel.setName("panel"+count++);//cria os panelpanel.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));panel.setSize(104,104);jPanel1.add(panel);System.out.println("Criando: "+panel.getName());//printa os panel sendo criados }jPanel1.repaint();//refaz jPanel1}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newNewJFrame().setVisible(true);}});}// Variables declaration - do not modify privatejavax.swing.JButtonjButton1;privatejavax.swing.JPaneljPanel1;
Eu costumo criar classes testes, como essa ae para testar alguma coisa q eu queira antes de fazer no projeto principal…entaum é essa ae a classe q to tentando testar.
obrigado novamente.
Eric_Yuzo
Como componentes estão sendo adicionados, acho que melhor do que o repaint() seria o revalidate().
while(count < 5){...}
jPanel1.revalidate();
fernandopaiva
ahhhh…muleke…kkk !!! Eric, com o metodo revalidate(); funcionou na hora…kkkk !!!
obrigado aeee…
acromo
O Fernando e onde esta o método initComponents()?
fernandopaiva
opa acromo, ja consegui resolver o problema com a dica do revalidate(); postada pelo Eric Yuzo.