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
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.
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?
Ok, acredito que agora tenha ficado melhor. Ele salvaria os resultados em uma lista, que você poderia retornar, ou fazero que bem entendesse.