Estou com uma dúvida na captura de informações do JTextField, estou trabalhando com padrão MVC só que a minha classe PessoaDAO que se encontra na camada de modelo precisa capturar as informações inseridas nos campos, com isso tudo a única forma aonde consegui capturar as informações foi ter deixado os JTextField como public e static para que eu consiga ter acesso as informações na classe PessoaDAO, só que é seguinte gostaria de saber de vocês se eu estou implementando este caso de forma correta e se existe uma forma apropriada de implementação para esse tipo de caso. Porem com tudo isso acho que estou quebrando a regra do padrão MVC, porque a minha classe PersonDAO está tendo acesso aos atributos do tipo JTextField que pertencem a classe FrameCadastro.
Segue abaixo o código que foi implementado:
packagebr.edu.unip.view;importjava.awt.Container;importjava.awt.GridLayout;importjava.text.ParseException;importjavax.swing.JButton;importjavax.swing.JFormattedTextField;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JTextField;importjavax.swing.text.MaskFormatter;importbr.edu.unip.controller.ListenerFrameCadastro;@SuppressWarnings("serial")publicclassFrameCadastroextendsJFrame{privateContainercontentPane;privateJLabellblNome;privateJLabellblNascimento;publicstaticJTextFieldtxtNome;publicstaticJFormattedTextFieldtxtNascimento;privateJButtonbtnSalvar;publicFrameCadastro(){super("Cadastro");contentPane=getContentPane();this.defineLayout(contentPane);this.setSize(200,160);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);}privatevoiddefineLayout(Containerc){c.setLayout(newGridLayout(6,1));lblNome=newJLabel("Nome:");c.add(lblNome);txtNome=newJTextField();c.add(txtNome);lblNascimento=newJLabel("Nascimento:");c.add(lblNascimento);MaskFormattermask=null;try{mask=newMaskFormatter("##/##/####");mask.setPlaceholderCharacter('_');txtNascimento=newJFormattedTextField(mask);}catch(ParseExceptione){JOptionPane.showMessageDialog(null,"Não foi possível converter a data de nascimento: "+e.getMessage());}c.add(txtNascimento);btnSalvar=newJButton("Salvar");btnSalvar.addActionListener(newListenerFrameCadastro());c.add(btnSalvar);}publicstaticvoidmain(String[]args){newFrameCadastro();}}
packagebr.edu.unip.model;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importbr.edu.unip.view.FrameCadastro;publicclassPessoaDAO{publicstaticvoidinsert(){Connectionconexao=FabricaDeConexao.getConexao();Stringsql="insert into pessoa(nome, nascimento) values (?, ?)";Pessoapessoa=newPessoa();pessoa.setNome(FrameCadastro.txtNome.getText());pessoa.setNascimento(FrameCadastro.txtNascimento.getText());try{PreparedStatementps=conexao.prepareStatement(sql);ps.setString(1,pessoa.getNome());ps.setString(2,pessoa.getNascimento());ps.executeUpdate();}catch(SQLExceptione){e.printStackTrace();}}}
Olá amigo, desse jeito vai funcionar sim… Mas o correto seria você declarar sua variável txtNome e txtNascimento, como private, e adicionando os métodos getters e setters de ambas, ficando dessa forma:
Quando você quiser retornar o que contém em nome e/ou nascimento você vai usar os metodos getters, e para setar as variáveis os metódos setters.
Entendeu?
MadeInJava
Valeu! cara achei bacana sua proposta só que o problema agora é o seguinte pra mim poder ter acesso a esses métodos getters e setters, vou ter que criar uma instância de FrameCadastro na classe PessoaDAO que é uma camada de modelo… eu implementei como você me falou só que o problema agora é que quando clico no botão salvar ele abre várias janelas e preenche os campos deixando como null no banco de dados.
packagebr.edu.unip.view;importjava.awt.Container;importjava.awt.GridLayout;importjava.text.ParseException;importjavax.swing.JButton;importjavax.swing.JFormattedTextField;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JTextField;importjavax.swing.text.MaskFormatter;importbr.edu.unip.controller.ListenerFrameCadastro;@SuppressWarnings("serial")publicclassFrameCadastroextendsJFrame{privateContainercontentPane;privateJLabellblNome;privateJLabellblNascimento;privateJTextFieldtxtNome;privateJFormattedTextFieldtxtNascimento;privateJButtonbtnSalvar;publicFrameCadastro(){super("Cadastro");contentPane=getContentPane();this.defineLayout(contentPane);this.setSize(200,160);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);}publicStringgetNome(){returntxtNome.getText();}publicStringgetNascimento(){returntxtNascimento.getText();}privatevoiddefineLayout(Containerc){c.setLayout(newGridLayout(6,1));lblNome=newJLabel("Nome:");c.add(lblNome);txtNome=newJTextField();c.add(txtNome);lblNascimento=newJLabel("Nascimento:");c.add(lblNascimento);MaskFormattermask=null;try{mask=newMaskFormatter("##/##/####");mask.setPlaceholderCharacter('_');txtNascimento=newJFormattedTextField(mask);}catch(ParseExceptione){JOptionPane.showMessageDialog(null,"Não foi possível converter a data de nascimento: "+e.getMessage());}c.add(txtNascimento);btnSalvar=newJButton("Salvar");btnSalvar.addActionListener(newListenerFrameCadastro());c.add(btnSalvar);}publicstaticvoidmain(String[]args){newFrameCadastro();}}
packagebr.edu.unip.model;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importbr.edu.unip.view.FrameCadastro;publicclassPessoaDAO{publicstaticvoidinsert(){Connectionconexao=FabricaDeConexao.getConexao();Stringsql="insert into pessoa(nome, nascimento) values (?, ?)";Pessoapessoa=newPessoa();pessoa.setNome(newFrameCadastro().getNome());pessoa.setNascimento(newFrameCadastro().getNascimento());try{PreparedStatementps=conexao.prepareStatement(sql);ps.setString(1,pessoa.getNome());ps.setString(2,pessoa.getNascimento());ps.executeUpdate();}catch(SQLExceptione){e.printStackTrace();}}}
MadeInJava
Testei novamente aqui só que agora eu deixei os getters e os JTextField como static ai funcionou normalmente salvo tudo certinho no banco de dados. Mas será que está correto deixar como static?
Henrique_Moraes
Entendi… tente colocar os metodos getters e setter como static
Vc constroi a View bonitinha com tudo que ela tem direito;
Em algum lugar da tua View vai ter um botão para gravar, certo?
No botão de gravar, vc vai adicionar um listener para “ouvir” os eventos de clic;
Nesse evento “clic”, é nele que vc vai instanciar um objeto do tipo PessoaDAO, dai vc tem acesso a todos os atributos da view, lembrando que vc está dentro da View;
No PessoaDAO recem criado vc lê todos os atributos e manda ele executar as tarefas desejadas.
Acho que é ± assim…
O
ode-to-joy
Olá, Bom dia. O que vc pode e deve fazer é adicionar mais uma camada. Da seguinte forma:
//primeiro, na classe ou na mesma classe do textField vc pode criar um objeto, uma string ou se houver um objeto pessoa, melhor, vc cria ele, com getters e setters.privateStringdataDeNascimento;privatePessoaTOpessoaTO;publicStringgetDataDeNascimento(){returndataDeNascimento;}publicvoidsetDataDeNascimento(StringdataDeNascimento){this.dataDeNascimento=dataDeNascimento;}publicPessoaTOgetPessoaTO(){returnpessoaTO;}publicvoidsetPessoaTO(PessoaTOpessoaTO){this.pessoaTO=pessoaTO;}//no botao salvar, no actionListener, vc seta o valor seja da string seja da Pessoa- depende de com o que vc estiver trabalhando.publicvoidadicionaListenerBotoes(){getBtnSalvar().addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){//se estiver trabalhando com string e não com um objetosetDataDeNascimento(getTextField().getText());// se estiver trabalhando com um objeto, vc popula ele aqui. Populei apenas um dado... Considerei que a variavel pessoaTO foi usada para popular a tela.getPessoaTO().setDataNascimento(getTextField().getText());//aqui vc chama a classe da camada intermediária que aparece logo abaixo, num método que passe como parâmetro o valor populado. Como prefiro trabalhar com objetos, entao estou enviando a pessoaTO para ele.getClasseIntermediaria().alterarPessoa(getPessoaTO)}});}publicFacadePessoagetClasseIntermediaria(){returnnewFacadePessoa();}//a classe intermediáriapublicclassFacadePessoa(){//primeiro, ela deve ter o PessoaDAOprivatePessoaDAOpessoaDAO;//cria o getter dela e depois o método que criamos na classe anteriorpublicPessoaDAOgetPessoaDAO(){returnpessoaDAO;}publicvoidalterarPessoa(PessoaTOpessoa){//aqui vc chama o método da sua DAO que vc quer passando como parâmetro a variavel recebida. getPessoaDAO().alterarPessoa(pessoa);}}
Dessa forma, vc mantém as camadas separadas, sem que sua view acesse diretamente o DAO, e sem que o DAO tenha que mexer ou lidar com a view. Caberia ainda mais camadas entre DAO e View, como por exemplo, a camada de Serviço(Service)- não sei se esse é o melhor nome- aonde ficariam as regras de negócio.
Só uma observação: não seria melhor se dentro do frame vc tivesse um Jpanel aonde vc colocasse os botões e textfields e todos os demais componentes gráficos?
espero ter te ajudado.