Alinhamento automatico.?

17 respostas
fernandopaiva

Salve salve galera…

Preciso criar alguns JPanel automaticamente e gostaria de alinha-los tbm automaticamente…vejam o codigo que estou usando.

int count = 0;
        JPanel panel;
        panel = new JPanel();

        while (count < 5){
            //criando jpanels
            panel.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…

Espero que entendam e possam me ajudar…Obrigado.

17 Respostas

ViniGodoy

Para isso, é importante que você não use nulllayout, e sim, layout managers:
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://download-llnw.oracle.com/javase/tutorial/uiswing/layout/

Se estiver fazendo as telas na mão, pode ser uma boa usar o MigLayout:
http://www.miglayout.com/QuickStart.pdf

fernandopaiva

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.

int count = 1;
        JPanel panel;
        panel = new JPanel();
        jPanel1.setLayout(new GridLayout()); //seta gridlayout para jPanel1 que vai receber os panel
        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

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:

int count = 1;  
   JPanel panel;  
   panel = new JPanel();  
   jPanel1.setLayout(new GridLayout(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:

while (count < 5){                
                panel.setName("panel" + count++); //cria panels

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:

int count = 1;           
           JPanel panel;
           jPanel1.setLayout(new GridLayout(3,2)); //seta gridlayout para jPanel1 que vai receber os panel
           while (count < 5){                
                panel = new JPanel();
                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

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.

int count = 1;           
           JPanel panel;
           jPanel1.setLayout(new GridLayout(3,2)); //seta gridlayout para jPanel1 que vai receber os panel
           while (count < 5){                
                panel = new JPanel();
                panel.setName("panel" + count++); //cria os panel
                panel.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.:

import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class NewJFrame extends javax.swing.JFrame {

    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
           int count = 1;           
           JPanel panel;
           jPanel1.setLayout(new GridLayout(3,2)); //seta gridlayout para jPanel1 que vai receber os panel
           while (count < 5){                
                panel = new JPanel();
                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
    }                                        

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;

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.

obrigado a todos pela ajuda, vcs são 10…:wink:

Criado 17 de outubro de 2010
Ultima resposta 18 de out. de 2010
Respostas 17
Participantes 4