Melhor forma de criar campos dinamicamente

6 respostas
J

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:
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
        }
    }


6 Respostas

D

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

D

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

G

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

da uma olhada ai que vai te ajudar bastante;

L

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

W

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).

W

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


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.

Criado 1 de fevereiro de 2013
Ultima resposta 1 de fev. de 2013
Respostas 6
Participantes 5