Problema em incluir campo em tempo de execução[RESOLVIDO]

Olá galera.
Estou com o seguinte problema.
Eu preciso fazer um sistema onde serao armazenados formularios com varias perguntas.
As perguntas podem ser do tipo discursiva ou multipla escolha.
O que eu quero é o seguinte.
Na minha tela de formulario, quero um botao de incluir pergunta, e clicar no botao, inserir dinamicamente os campos de cadastro de pergunta.
No caso de multipla escolha, apareceria 6 campo, 1 com a pergunta e 5 com as alternativas.
E ir podendo inserir novos campos conforme a pessoa for cadastrando novas perguntas.

Obrigado

Normalmente em testes de múltipla escolha você tem no máximo 5 alternativas, não? Eu deixaria as 5 alternativas no lugar, mas desabilitaria ou habilitaria as alternativas conforme o número delas.

Concordo com entanglement poem 5 campos e boa, pra que mais de 5 alternativas, so para deixar o codigo mais dificil e se for um usuario serio utilizando o sistema nunca utilizara mais de 5 opções mesmo

Mais a minha duvida não é bem essa.
Se o usuario quer inserir uma nova pergunta, ele clica em inserir, e apareceria os campos para cadastro na msm frame, dinamicamente.
no case de ser multipla escolha ou nao, é um problema mais a frente.

Eu estava pensando em faze mais ou menos assim.
Crio um panel por exemplo PergDiscursiva com varios TextField.
E eu possui um jframe CadastroDeFormulario.
Dentro destra jframe CadastrodeFormulario teria um botao incluir.
quando clicado, dentro do Jframe CadastroDeFormulario, apareceria os campos do panel PergDiscursiva.

Espero que esteja mais claro minha duvida.

Crie um Array de components dos seus formularios, exemplo indice 0 para resposta discursiva e 1 para perguntas de multipla escolha

Component[] formularios = new Component[2];
formularios[0] = new PerguntaDisc();
formularios[1] = new PerguntaEscolha();

Crie um JPanel no seu JFrame onde vc quer colocar os formularios e insira na sua tela

JPanel jPanel = new JPanel(new GridLayout(1,1));//componente onde vc quer colocar os formularios
jFrame.getContentPane().add(jPanel);//essa linha depende de como vc esta fazendo a tela

Adicione isso num action listener, provavelmente no botao inserir

formularios[0].setVisible(false);
formularios[1].setVisible(false);
formularios[selecionado].limparFormulario();//Deve resetar, limpar os campos para inserir um novo
formularios[selecionado].setVisible[true];//N sei como é selecionado o tipo de questao
jPanel.add(formulario[selecionado]);
jPanel.repaint();//N tenho certeza se esta linha é necessária

Acho q é ± isso q vc quer, espero ter ajudado

[quote=epassagem]Mais a minha duvida não é bem essa.
Se o usuario quer inserir uma nova pergunta, ele clica em inserir, e apareceria os campos para cadastro na msm frame, dinamicamente.
no case de ser multipla escolha ou nao, é um problema mais a frente.

Eu estava pensando em faze mais ou menos assim.
Crio um panel por exemplo PergDiscursiva com varios TextField.
E eu possui um jframe CadastroDeFormulario.
Dentro destra jframe CadastrodeFormulario teria um botao incluir.
quando clicado, dentro do Jframe CadastroDeFormulario, apareceria os campos do panel PergDiscursiva.

Espero que esteja mais claro minha duvida.[/quote]

Minha msg anterior saiu atrasada, ainda n entendi muito bem, mas se aquilo n ajudou, talvez um JTable ou JList possa te ajudar, mas ai teria q procurar como trasformar as células do JTable ou JList para o component q vc quer (axo q é JTextfield).

Rode o código abaixo e veja se é o que você quer. Requer a biblioteca MigLayout

package guj;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import net.miginfocom.swing.MigLayout;

public class TesteExemploCamposDinamicos extends JFrame {

    private JPanel contentPane;
    private JScrollPane scrollPane;
    private JPanel pnlBotoes;
    private JButton btnAdicionarQuesto;
    private JPanel pnlQuestoes;
    private List<JLabel> labels;
    private List<JTextField> textFields;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TesteExemploCamposDinamicos frame = new TesteExemploCamposDinamicos();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TesteExemploCamposDinamicos() {
        setTitle("Exemplo de Campos Dinamicos");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        contentPane.add(getScrollPane(), BorderLayout.CENTER);
        contentPane.add(getPnlBotoes(), BorderLayout.SOUTH);
        labels = new ArrayList<JLabel>();
        textFields = new ArrayList<JTextField>();
    }

    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getPnlQuestoes());
        }
        return scrollPane;
    }

    private JPanel getPnlBotoes() {
        if (pnlBotoes == null) {
            pnlBotoes = new JPanel();
            pnlBotoes.add(getBtnAdicionarQuesto());
        }
        return pnlBotoes;
    }

    private JButton getBtnAdicionarQuesto() {
        if (btnAdicionarQuesto == null) {
            btnAdicionarQuesto = new JButton("Adicionar Quest\u00E3o");
            btnAdicionarQuesto.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    addQuestao();
                }
            });
        }
        return btnAdicionarQuesto;
    }

    private JPanel getPnlQuestoes() {
        if (pnlQuestoes == null) {
            pnlQuestoes = new JPanel();
            pnlQuestoes.setLayout(new MigLayout("", "[][grow]", "[][]"));
        }
        return pnlQuestoes;
    }

    int nQuestoes = 0;

    private void addQuestao() {
        JLabel lbl;
        JTextField txt;

        pnlQuestoes.add(lbl = new JLabel(String.format("Questão %d", nQuestoes)), String.format("cell 0 %d", nQuestoes));
        pnlQuestoes.add(txt = new JTextField(), String.format("cell 1 %d,alignx trailing", nQuestoes));
        txt.setColumns(10);
        nQuestoes++;
        txt.requestFocusInWindow();
        scrollPane.validate();
        pnlQuestoes.scrollRectToVisible(txt.getBounds());
    }
}

A propósito, é a primeira vez que escrevo um programa em Java que tem um formulário com N campos e uma JScrollPane. Gastei um tempinho até entender que scrollRectToVisible tinha de ser chamada no JPanel que está dentro do JScrollPane, não no JScrollPane em si.

Nossa entanglement, era isso mesmo o que eu precisava.
Soh falta eu adaptar pra te 2 botoes.
Se eu clicar em um, aparece um campo
Se eu clicar em outro, aparece outra panel.

Vlwzz

Pra ver como plugins como o WindowBuilder economizam tempo de codificação, no exemplo que dei só criei o miolo do código que atende o botão, o método addQuestao, e mudei algumas coisas - eu tinha criado um JTextField e um JLabel com o WindowBuilder, só para ver como é que ficava o layout do MigLayout. Depois tirei isso e troquei por um ArrayList de JTextField e um ArrayList de JLabel. E por incrível que pareça o WindowBuilder ainda conseguiu mostrar um JTextField e um JLabel desse ArrayList :slight_smile:

Estou com uma duvida noob agora.
como que eu faço pra pegar os valores digitados nos TextField?
Tem como voce me posta um exemplo?

Vlwzz

Você não viu que eu criei um ArrayList de JTextField? Então…

Por exemplo, digamos que você queira pegar o que está na posição 0 desse array (que chamei de “textfields” por pura falta de imaginação). Para pegar o conteúdo, basta usar:

String s = textfields.get (0).getText();

AhauhAUhAUha
Nossa, nb

vlwzz

Deu certo…
Fiz as modificações necessarias e esta funcionando.
Eu inclui um botao de salvar, para cada nova pergunta, aparece um botao de salvar e ja armazena no banco.
Nao ficou a coisa mais elegante, mais pelo menos ta funcionando.
Vo posta o codigo pra quem quize da uma olhada, pq achei mt util.

[code]package asma.projeto;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import net.miginfocom.swing.MigLayout;

public class AdicionaNovaPerg extends JFrame {

private JPanel contentPane;
private JScrollPane scrollPane;
private JPanel pnlBotoes;
private JButton adicionaDisc;
private JButton adicionaMult;
private JButton salvar;
private JPanel pnlQuestoes;
private List<JLabel> labels;
private List<JTextField> textFields;
private int nQuestoes = 1;
private int nAlternativa = 1;
Formulario form;

/** 
 * Launch the application. 
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        Formulario form;

        public void run() {
            try {
                AdicionaNovaPerg frame = new AdicionaNovaPerg(form);
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/** 
 * Create the frame. 
 */
public AdicionaNovaPerg(Formulario form) {
    this.form = form;
    setTitle("Adicionar Perguntas");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 900, 600);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    contentPane.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Cadastrar Perguntas", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Arial", 1, 18)));
    setContentPane(contentPane);
    contentPane.add(getScrollPane(), BorderLayout.CENTER);
    contentPane.add(getPnlBotoes(), BorderLayout.SOUTH);
    labels = new ArrayList<JLabel>();
    textFields = new ArrayList<JTextField>();
}

private JScrollPane getScrollPane() {
    if (scrollPane == null) {
        scrollPane = new JScrollPane();
        scrollPane.setViewportView(getPnlQuestoes());
    }
    return scrollPane;
}

private JButton Salvar() {
    if (adicionaDisc == null) {
        adicionaDisc = new JButton("Salvar");
        adicionaDisc.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new Inicio().setVisible(true);
            }
        });
    }
    return adicionaDisc;
}

private JPanel getPnlBotoes() {
    if (pnlBotoes == null) {
        pnlBotoes = new JPanel();
        pnlBotoes.add(getBtnAdicionarDisc());
        pnlBotoes.add(getBtnAdicionarMult());
    }
    return pnlBotoes;
}

private JPanel getSalvar() {
    if (pnlBotoes == null) {
        pnlBotoes = new JPanel();
        // pnlBotoes.add(getBtnAdicionarDisc());
        pnlBotoes.add(Salvar());
        //  pnlBotoes.add(getBtnAdicionarMult());
    }
    return pnlBotoes;
}

private JButton getBtnAdicionarDisc() {
    if (adicionaDisc == null) {
        adicionaDisc = new JButton("Adicionar Quest\u00E3o Discursiva");
        adicionaDisc.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                addQuestaoDisc();
            }
        });
    }
    return adicionaDisc;
}

private JButton getBtnAdicionarMult() {
    if (adicionaMult == null) {
        adicionaMult = new JButton("Adicionar Quest\u00E3o de Multipla Escolha");
        adicionaMult.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                addQuestaoMulti();
            }
        });
    }
    return adicionaMult;
}

private JPanel getPnlQuestoes() {
    if (pnlQuestoes == null) {
        pnlQuestoes = new JPanel();
        pnlQuestoes.setLayout(new MigLayout("", "[][grow]", "[][]"));
    }
    return pnlQuestoes;
}

private void addQuestaoDisc() {
    JLabel lbl;
    JTextField txt;
    JButton salvar = new JButton("Salvar");

    pnlQuestoes.add(lbl = new JLabel(String.format("Questão Discursiva", nAlternativa)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(txt = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    txt.setColumns(60);
    salvar.addActionListener((new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            new PaginaInicial().setVisible(true);
        }
    }));
    pnlQuestoes.add(salvar, String.format("cell 2 %d,alignx left", nAlternativa));
    nAlternativa++;
    txt.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(txt.getBounds());

}

private void addQuestaoMulti() {

    JLabel perg, alt1, alt2, alt3, alt4, alt5;
    JButton salvar = new JButton("Salvar");
    JTextField tfperg, tfalt1, tfalt2, tfalt3, tfalt4, tfalt5;;

    pnlQuestoes.add(perg = new JLabel(String.format("Questão Multipla Escolha", nAlternativa)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(tfperg = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfperg.setColumns(60);
    nAlternativa++;
    tfperg.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfperg.getBounds());
    pnlQuestoes.add(alt1 = new JLabel(String.format("Alternativa A", nAlternativa - 1)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(tfalt1 = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfalt1.setColumns(60);
    nAlternativa++;
    tfalt1.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfalt1.getBounds());
    pnlQuestoes.add(alt2 = new JLabel(String.format("Alternativa B", nAlternativa)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(tfalt2 = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfalt2.setColumns(60);
    nAlternativa++;
    tfalt2.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfalt2.getBounds());
    pnlQuestoes.add(alt3 = new JLabel(String.format("Alternativa C", nAlternativa)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(tfalt3 = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfalt3.setColumns(60);
    nAlternativa++;
    tfalt3.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfalt3.getBounds());
    pnlQuestoes.add(alt4 = new JLabel(String.format("Alternativa D", nAlternativa)), String.format("cell 0 %d", nAlternativa));
    pnlQuestoes.add(tfalt4 = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfalt4.setColumns(60);
    nAlternativa++;
    tfalt4.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfalt4.getBounds());
    pnlQuestoes.add(alt5 = new JLabel(String.format("Alternativa E", nAlternativa)), String.format("cell 0 %d", nAlternativa));

    pnlQuestoes.add(tfalt5 = new JTextField(), String.format("cell 1 %d,alignx left", nAlternativa));
    tfalt5.setColumns(60);
    salvar.addActionListener((new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            new PaginaInicial().setVisible(true);
        }
    }));
    pnlQuestoes.add(salvar, String.format("cell 2 %d,alignx left", nAlternativa));
    nAlternativa++;
    tfalt5.requestFocusInWindow();
    scrollPane.validate();
    pnlQuestoes.scrollRectToVisible(tfalt5.getBounds());
}

}
[/code]

Eu não ensinei programação copy & paste :frowning: :frowning: :frowning: - credo