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:
Agora temos o Desktop, que é uma extenção de um JDesktopPane:
Agora temos a classe que realmente faz o trabalho duro, que é Botao, que estende de um JButton:
E para tudo isso funcionar precisamos da nossa classe Main:
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
BotaoEnviar
Main
Para baixar essa nova versão clique aqui.
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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |



#1 by Maurício Faustino on 5 de Maio de 2009 - 14:44
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 by Flávio J. Mendes on 6 de Maio de 2009 - 0:45