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:
 Java |  copy code |? 
01
02
public class JanelaPrincipal extends JFrame{
03
 
04
	public void iniciaJanela(int largura, int altura){
05
		super.setVisible(true);//seta janela visível
06
		super.setSize(largura, altura);//seta o tamanho da janela.
07
	}
08
 
09
	public void adicionaDesktop(Desktop desktop){
10
		super.add(desktop);//adiciona um desktopPane à janela.
11
	}	
12
}
13
Agora temos o Desktop, que é uma extenção de um JDesktopPane:
 Java |  copy code |? 
01
02
import javax.swing.JDesktopPane;
03
 
04
public class Desktop extends JDesktopPane{
05
 
06
	public void iniciaDesktop(){
07
		super.setVisible(true);//seta desktop visível
08
	}
09
 
10
	public void adicionaBotao(Botao botao){
11
		super.add(botao);//adiciona botão ao desktop
12
	}
13
}
14
Agora temos a classe que realmente faz o trabalho duro, que é Botao, que estende de um JButton:
 Java |  copy code |? 
01
02
public class Botao extends JButton{
03
	private int y=10;//atributo para controle da posição vertical dos textareas
04
 
05
	public void iniciaBotao(int largura, int altura,String texto,final Desktop desktop){
06
		super.setBounds(10, 10, largura, altura);//seta posicionamento e tamanho do botao.
07
		super.setText(texto);//seta o texto do botão.
08
 
09
		super.addActionListener(new java.awt.event.ActionListener()  
10
		{  //adiciona o evento ao botão
11
			public void actionPerformed(java.awt.event.ActionEvent e)   
12
			{         
13
				adicionaTextField(desktop);     //adiciona o campo                               
14
			}  
15
		});  
16
	}
17
 
18
	public void adicionaTextField(Desktop desktop){
19
		if(desktop.getHeight()-60>y){//condição para não mais campos do que cabem no desktop
20
		JTextField textField = new JTextField();//intancia novo textfield
21
		textField.setName("text"+y);//seta o nome do textfiel para posterior uso, caso necessário
22
		textField.setBounds(150, y, 200, 30);//seta posição do campo
23
		desktop.add(textField);//adiciona campo ao desktop
24
		y+=40;//incrementa a posição vertical.
25
		}
26
	}
27
}
28
E para tudo isso funcionar precisamos da nossa classe Main:
 Java |  copy code |? 
01
02
public class Main {
03
	public static void main(String[] args) {
04
		JanelaPrincipal janelaPrincipal = new JanelaPrincipal(); //aqui instanciamos a janela principal
05
		janelaPrincipal.iniciaJanela(440,480);//iniciamos a janela com o tamanho passado.
06
		Desktop desktop = new Desktop();//instancia o jDesktop, que servirá para orientacao dos componentes
07
		desktop.iniciaDesktop();//inicia o desktop
08
		Botao botao = new Botao();//instancia o botao
09
		botao.iniciaBotao(100,50,"Add Campo",desktop);//inicia o botão com os parametros
10
		desktop.adicionaBotao(botao);//adiciona o botão ao desktop
11
		janelaPrincipal.adicionaDesktop(desktop);//adiciono o desktop à janela principal
12
	}
13
}
14

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
 Java |  copy code |? 
01
02
public class Desktop extends JDesktopPane{
03
 
04
	public void iniciaDesktop(){
05
		super.setVisible(true);//seta desktop visível
06
	}
07
 
08
	public void adicionaBotao(JButton botao){
09
		super.add(botao);//adiciona botão ao desktop
10
	}
11
}
12
BotaoEnviar
 Java |  copy code |? 
01
02
public class BotaoEnviar extends JButton{
03
 
04
	public void iniciaBotao(int largura, int altura,String texto,final Desktop desktop){
05
		super.setBounds(10, 60, largura, altura);//seta posicionamento e tamanho do botao.
06
		super.setText(texto);//seta o texto do botão.
07
 
08
		super.addActionListener(new java.awt.event.ActionListener()  
09
		{  //adiciona o evento ao botão
10
			public void actionPerformed(java.awt.event.ActionEvent e)   
11
			{         
12
				enviaFormulario(desktop);     //adiciona o campo                               
13
			}
14
 
15
			private void enviaFormulario(Desktop desktop) {
16
				List<String> listaDeValores = new LinkedList<String>();//cria uma nova lista de string
17
				for(Component component:desktop.getComponents()){//faz um loop para cada componente de desktop
18
					if(component instanceof JTextField){//se o componente for do tipo TextField
19
						listaDeValores.add(((JTextField) component).getText());//adiciona o valor dele à lista
20
					}
21
				}
22
				String valores = "";//apenas para demostrar visualmente que a lista foi criada com sucesso
23
				for(String valor:listaDeValores){//apenas para demostrar visualmente que a lista foi criada com sucesso
24
					valores += valor+",";//apenas para demostrar visualmente que a lista foi criada com sucesso
25
				}
26
				JFrame tp = new JFrame();//apenas para demostrar visualmente que a lista foi criada com sucesso
27
				tp.setVisible(true);//apenas para demostrar visualmente que a lista foi criada com sucesso
28
				tp.setBounds(30,30,200, 90);//apenas para demostrar visualmente que a lista foi criada com sucesso
29
				JTextPane text = new JTextPane();//apenas para demostrar visualmente que a lista foi criada com sucesso
30
				text.setEnabled(false);//apenas para demostrar visualmente que a lista foi criada com sucesso
31
				text.setText(valores);//apenas para demostrar visualmente que a lista foi criada com sucesso
32
				tp.add(text);//apenas para demostrar visualmente que a lista foi criada com sucesso
33
			}  
34
		});  
35
	}
36
}
37
Main
 Java |  copy code |? 
01
02
public class Main {
03
	public static void main(String[] args) {
04
		JanelaPrincipal janelaPrincipal = new JanelaPrincipal(); //aqui instanciamos a janela principal
05
		janelaPrincipal.iniciaJanela(440,480);//iniciamos a janela com o tamanho passado.
06
		Desktop desktop = new Desktop();//instancia o jDesktop, que servirá para orientacao dos componentes
07
		desktop.iniciaDesktop();//inicia o desktop
08
		Botao botao = new Botao();//instancia o botao
09
		botao.iniciaBotao(100,50,"Add Campo",desktop);//inicia o botão com os parametros
10
		desktop.adicionaBotao(botao);//adiciona o botão ao desktop
11
		BotaoEnviar enviar = new BotaoEnviar();//instancia o botao enviar
12
		enviar.iniciaBotao(100,50,"Enviar",desktop);//inicia o botão com os parametros
13
		desktop.adicionaBotao(enviar);//adiciona o botão ao desktop
14
		janelaPrincipal.adicionaDesktop(desktop);//adiciono o desktop à janela principal
15
	}
16
}
17
Para baixar essa nova versão clique aqui.

, ,

  1. #1 by Maurício Faustino on 5 de Maio de 2009 - 14:44

    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. #2 by Flávio J. Mendes on 6 de Maio de 2009 - 0:45

    Ok, acredito que agora tenha ficado melhor. Ele salvaria os resultados em uma lista, que você poderia retornar, ou fazero que bem entendesse.
(não será publicado)