Adicionar Campos Dinâmicos

Há um tempo atrás, um colega meu, Maurício Faustino, escreveu um post em seu blog, que era a adição de campos dinâmicos em um formulário web usando a biblioteca JQuery. Achei um post muito bacana e me propus um desafio. Fazer esse tipo de adição de campos dinâmicos usando Java Swing. Fiz e agora vou postar para vocês:

Então, dessa vez a aplicação vai ser composta por 4 classes. Elas são a Main, JanelaPrincipal, Desktop e Botao. Vamos começar com a JanelaPrincipal, que é um extenção de um JFrame:

public class JanelaPrincipal extends JFrame{

public void iniciaJanela(int largura, int altura){
super.setVisible(true);//seta janela visível
super.setSize(largura, altura);//seta o tamanho da janela.
}

public void adicionaDesktop(Desktop desktop){
super.add(desktop);//adiciona um desktopPane à janela.
}
}

Agora temos o Desktop, que é uma extenção de um JDesktopPane:

import javax.swing.JDesktopPane;

public class Desktop extends JDesktopPane{

public void iniciaDesktop(){
super.setVisible(true);//seta desktop visível
}

public void adicionaBotao(Botao botao){
super.add(botao);//adiciona botão ao desktop
}
}

Agora temos a classe que realmente faz o trabalho duro, que é Botao, que estende de um JButton:

public class Botao extends JButton{
private int y=10;//atributo para controle da posição vertical dos textareas

public void iniciaBotao(int largura, int altura,String texto,final Desktop desktop){
super.setBounds(10, 10, largura, altura);//seta posicionamento e tamanho do botao.
super.setText(texto);//seta o texto do botão.

super.addActionListener(new java.awt.event.ActionListener()
{ //adiciona o evento ao botão
public void actionPerformed(java.awt.event.ActionEvent e)
{
adicionaTextField(desktop); //adiciona o campo
}
});
}

public void adicionaTextField(Desktop desktop){
if(desktop.getHeight()-60>y){//condição para não mais campos do que cabem no desktop
JTextField textField = new JTextField();//intancia novo textfield
textField.setName("text"+y);//seta o nome do textfiel para posterior uso, caso necessário
textField.setBounds(150, y, 200, 30);//seta posição do campo
desktop.add(textField);//adiciona campo ao desktop
y+=40;//incrementa a posição vertical.
}
}
}

E para tudo isso funcionar precisamos da nossa classe Main:

public class Main {
public static void main(String[] args) {
JanelaPrincipal janelaPrincipal = new JanelaPrincipal(); //aqui instanciamos a janela principal
janelaPrincipal.iniciaJanela(440,480);//iniciamos a janela com o tamanho passado.
Desktop desktop = new Desktop();//instancia o jDesktop, que servirá para orientacao dos componentes
desktop.iniciaDesktop();//inicia o desktop
Botao botao = new Botao();//instancia o botao
botao.iniciaBotao(100,50,"Add Campo",desktop);//inicia o botão com os parametros
desktop.adicionaBotao(botao);//adiciona o botão ao desktop
janelaPrincipal.adicionaDesktop(desktop);//adiciono o desktop à janela principal
}
}

Para ver funcionando, clique aqui para fazer o download.

Espero que tenha ficado claro o conceito que quis passar. Até a próxima.

O Maurício fez a pergunta, e vi que realmente não havia implementado a parte do envio. Então fiz uma alteração no Desktop e no Main, e criei a classe BotaoEnviar. Segue abaixo os códigos:

Desktop

public class Desktop extends JDesktopPane{

public void iniciaDesktop(){
super.setVisible(true);//seta desktop visível
}

public void adicionaBotao(JButton botao){
super.add(botao);//adiciona botão ao desktop
}
}

BotaoEnviar

public class BotaoEnviar extends JButton{

public void iniciaBotao(int largura, int altura,String texto,final Desktop desktop){
super.setBounds(10, 60, largura, altura);//seta posicionamento e tamanho do botao.
super.setText(texto);//seta o texto do botão.

super.addActionListener(new java.awt.event.ActionListener()
{ //adiciona o evento ao botão
public void actionPerformed(java.awt.event.ActionEvent e)
{
enviaFormulario(desktop); //adiciona o campo
}

private void enviaFormulario(Desktop desktop) {
List listaDeValores = new LinkedList();//cria uma nova lista de string
for(Component component:desktop.getComponents()){//faz um loop para cada componente de desktop
if(component instanceof JTextField){//se o componente for do tipo TextField
listaDeValores.add(((JTextField) component).getText());//adiciona o valor dele à lista
}
}
String valores = "";//apenas para demostrar visualmente que a lista foi criada com sucesso
for(String valor:listaDeValores){//apenas para demostrar visualmente que a lista foi criada com sucesso
valores += valor+",";//apenas para demostrar visualmente que a lista foi criada com sucesso
}
JFrame tp = new JFrame();//apenas para demostrar visualmente que a lista foi criada com sucesso
tp.setVisible(true);//apenas para demostrar visualmente que a lista foi criada com sucesso
tp.setBounds(30,30,200, 90);//apenas para demostrar visualmente que a lista foi criada com sucesso
JTextPane text = new JTextPane();//apenas para demostrar visualmente que a lista foi criada com sucesso
text.setEnabled(false);//apenas para demostrar visualmente que a lista foi criada com sucesso
text.setText(valores);//apenas para demostrar visualmente que a lista foi criada com sucesso
tp.add(text);//apenas para demostrar visualmente que a lista foi criada com sucesso
}
});
}
}

Main

public class Main {
public static void main(String[] args) {
JanelaPrincipal janelaPrincipal = new JanelaPrincipal(); //aqui instanciamos a janela principal
janelaPrincipal.iniciaJanela(440,480);//iniciamos a janela com o tamanho passado.
Desktop desktop = new Desktop();//instancia o jDesktop, que servirá para orientacao dos componentes
desktop.iniciaDesktop();//inicia o desktop
Botao botao = new Botao();//instancia o botao
botao.iniciaBotao(100,50,"Add Campo",desktop);//inicia o botão com os parametros
desktop.adicionaBotao(botao);//adiciona o botão ao desktop
BotaoEnviar enviar = new BotaoEnviar();//instancia o botao enviar
enviar.iniciaBotao(100,50,"Enviar",desktop);//inicia o botão com os parametros
desktop.adicionaBotao(enviar);//adiciona o botão ao desktop
janelaPrincipal.adicionaDesktop(desktop);//adiciono o desktop à janela principal
}
}

Para baixar essa nova versão clique aqui.

2 Responses to “Adicionar Campos Dinâmicos”

  1. Muito legal!!!
    Mas como fica a informação que o usuário digitou nos campos? Ficam em de um forma de array quando o formulario é submetido?

  2. Ok, acredito que agora tenha ficado melhor. Ele salvaria os resultados em uma lista, que você poderia retornar, ou fazero que bem entendesse.

Leave a Reply

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>