Melhor forma de criar campos dinamicamente

Pessoal tenho um pequeno sistema que dependendo do que for selecionado em um combo ele precisa criar alguns campos dinamicamente (percorrendo uma lista de opções), variando de 1 a 8 campos, os quais estou usando JTextField normal.

O que estou fazendo é adicionar esses campos (com alguns labels) a um JPanel, e esse JPanel está usando o GridLayout, mas fica muito “feio” a aparência, por que as vezes os campos ficam muito “altos”.

Qual seria a melhor forma de fazer isso? Que layout eu poderia usar no JPanel para adicionar linhas com 3 colunas (um label, um campo, um label)?

Segue o código que uso para adicionar os campos ao painel:

[code]
painelCamposAdicionais.removeAll();
painelCamposAdicionais.revalidate();
painelCamposAdicionais.setLayout(new java.awt.GridLayout(linhas, 3, 5, 10));

for (int i = 4; i < lista.length; i++) {
    if (i < lista.length - 2) {
        String[] parAtual = lista[i];

        String parametro = (parAtual[0].split(" ")[1]).trim();
        String titulo = parAtual[1].trim();

        if (!"".equals(titulo)) {
            //System.out.println("String: " + parAtual[0] + " => " + parAtual[1]);
            String[] parTipo = lista[i + 1];
            String[] parTamanho = lista[i + 2];
            String tipo = parTipo[1];
            String tamanho = parTamanho[1].trim();
            if ("".equals(tamanho)) {
                tamanho = "1";
            }
            int t = Integer.parseInt(tamanho);

            PlainDocumentTextField tipoDoc = new PlainDocumentTextField(PlainDocumentTextField.TUDO, t, true);
            switch (tipo) {
                case "data":
                    tipo = "data (dd/mm/aaaaa)";
                    tipoDoc = new PlainDocumentTextField(PlainDocumentTextField.DATA, t, true);
                    break;
                case "bit":
                    tipo = "bit (0=falso, 1=verdadeiro)";
                    tipoDoc = new PlainDocumentTextField(PlainDocumentTextField.NUMERICO, t, true);
                    break;
                case "seleção":
                    tipo = "seleção (...)";
                    break;
                case "int longo":
                    t = 15;
                    tipo = "número inteiro (ex: 234543)";
                    tipoDoc = new PlainDocumentTextField(PlainDocumentTextField.NUMERICO, t, true);
                    break;
            }
            tipo += " - (" + tamanho + ")";

            JLabel labelCampo = new JLabel(titulo + ":");
            JTextField campoOpcional = new JTextField(t);
            campoOpcional.setName(parametro);

            campoOpcional.setDocument(tipoDoc);
            labelCampo.setLabelFor(campoOpcional);

            painelCamposAdicionais.add(labelCampo);
            painelCamposAdicionais.add(campoOpcional);
            painelCamposAdicionais.add(new JLabel(tipo));

        }
        i = i + 2; // para dar o salto correto na lista
    }
}[/code]




ja faz tempo que mexi com swing, mas na época pra mim o melhor layout era o GridBagLayout.

com ele eu tinha um controle maior sobre os componentes

verdade, eu não prestei atenção na parte que ele falava sobre os campos dinâmicos, rsrsr

http://docs.oracle.com/javase/tutorial/uiswing/layout/spring.html

da uma olhada ai que vai te ajudar bastante;

Em meu sistema eu precisei criar componentes dinâmicos para cadastrar os componentes de um computador, ou seja, tem máquina com 2 monitores por exemplo. Eu utilizei o SpringUtilies da própria Oracle http://docs.oracle.com/javase/tutorial/uiswing/examples/layout/SpringGridProject/src/layout/SpringUtilities.java

Ele já organiza certinho os componentes.

A última imagem é como ficou a tela de cadastro dinâmica: http://www.scout.inf.br/?pagina=screenshots

Dê uma olhada no tutorial sobre layouts do Swing da própria Oracle.
Cada layout define e usa um conjunto de métodos (especialemente os relacionados aos “preferredSize” (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)

Mas você pode criar um componente (JPanel) que possua um label e um field e que possua algum método exposto para definir o texto do layout. E esse panel terá definido um layout que não deforme teu componente. Assim que adicioná-lo ao teu GridLayout, quem será redimensionado será o panel mas o layout do mesmo manterá o componente ajustado.

Outra opção é o BoxLayout que usa conceitos de “Glue” que permitem forçar o posicionamento do componente (de acordo com a orientação dada ao BoxLayout (veja lá no tutorial tbm).

[quote=DaniloAndrade]ja faz tempo que mexi com swing, mas na época pra mim o melhor layout era o GridBagLayout.

com ele eu tinha um controle maior sobre os componentes[/quote]
Para a necessidade dele o GridBagLayout é um pouco mais chato de trabalhar e acaba não sendo muito bom para mudanças dinâmicas como citadas.