Ir ao conteúdo
  • Cadastre-se

Após o método de validação ser true, como cancelar o envio dos dados ao banco?


Posts recomendados

Tenho a aplicação ja feita. A classe Produto, ProdutoDAO e um método validaProdutoPorDescricao().

 

JButton btnCadastrarProduto = new JButton("Cadastrar");
		btnCadastrarProduto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				Produto prod = new Produto();
				prod.setDescricao(campoDescricao.getText());
				/*if (!prod.validaProdutoPorDescricao(prod))
					JOptionPane.showMessageDialog(null, "Produto com nome inválido");*/

				prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
				prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
				prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));
				
				ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
				prodao.registra(prod);
				
				campoDescricao.setText("");
				campoSaldoEstoque.setText("");
				campoPrecoDeCompra.setText("");
				campoPrecoDeVenda.setText("");
				
				// TODO FAZER AÇÃO DO BOTÃO CADASTRAR
			}
		});
		btnCadastrarProduto.setBounds(231, 200, 135, 25);
		contentPane.add(btnCadastrarProduto);

 

A parte comentada é onde faço um teste para chamar o método e verificar o argumento passado para ele. O método funciona, porém queria fazer com que, caso o método seja chamado, interromper os dados passados no formulário e cancelar o envio, pois mesmo o método sendo chamado os dados estão indo para o banco.

 

Link para o comentário
Compartilhar em outros sites

Você pode fazer algo simples, assim:

JButton btnCadastrarProduto = new JButton("Cadastrar");
        btnCadastrarProduto.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                Produto prod = new Produto();
                prod.setDescricao(campoDescricao.getText());
                if (!prod.validaProdutoPorDescricao(prod)) {
                    JOptionPane.showMessageDialog(null, "Produto com nome inválido");
                } else {
                    prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
                    prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
                    prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));

                    ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
                    prodao.registra(prod);

                    campoDescricao.setText("");
                    campoSaldoEstoque.setText("");
                    campoPrecoDeCompra.setText("");
                    campoPrecoDeVenda.setText("");

                    // TODO FAZER AÇÃO DO BOTÃO CADASTRAR
                }
            }
        });
        btnCadastrarProduto.setBounds(231, 200, 135, 25);
        contentPane.add(btnCadastrarProduto);

Ou criar um método que executa a gravação caso a resposta seja positiva, assim:

 

public boolean validaProduto(String descricao) {
 	//Escreva o método de validação do produto
}

public void actionPerformed(ActionEvent e) {
	if (validaProduto(campoDescricao.getText()) {
		cadastraProduto();	     
    } else {
      JOptionPane.showMessageDialog(null, "Produto com nome inválido");
    }
}
        
public void cadastraProduto() {
	Produto prod = new Produto();
    prod.setDescricao(campoDescricao.getText());
    prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
    prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
    prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));

    ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
    prodao.registra(prod);

    campoDescricao.setText("");
    campoSaldoEstoque.setText("");
    campoPrecoDeCompra.setText("");
    campoPrecoDeVenda.setText("");  
}

A melhor prática de programação é criar métodos especializados. Um que faça validações, outro que prepare o objeto com os dados da tela e outro que efetivamente grave os dados e outro que gerencie a tela.

 

Poderia ter um método que "limpe" a tela e zere as variáveis toda vez que o frame for aberto ou um produto seja gravado.

 

No exemplo acima, preparar o objeto, gravar em banco e limpar a tela é feito no mesmo método cadastraProduto() pois o objeto é pequeno e a tela simples. Mas fica a dica quando for criar telas mais complexas e com validações mais rebuscadas.

Link para o comentário
Compartilhar em outros sites

O método validaProduto eu ja tenho, criei em uma Interface, logo eu chamo ela no código. Mas para eu chamar no código tenho que instanciar um objeto do tipo Produto la em cima primeiro, logo nao consigo fazer o mesmo que você para no caso criar um método extraído "cadastraProduto"....

 

public void actionPerformed(ActionEvent e) {

			Produto prod = new Produto();
			prod.setDescricao(campoDescricao.getText());
			prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));

			if (!prod.isProdutoValido()) {
				JOptionPane.showMessageDialog(null, "Produto com nome inválido");

				if (!prod.isProdutoValido(Integer.parseInt(campoSaldoEstoque.getText())))
					JOptionPane.showMessageDialog(null, "Quantidade do produto com valor inválido");
			}

			else {
				prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
				prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));

				ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
				prodao.registra(prod);

				campoDescricao.setText("");
				campoSaldoEstoque.setText("");
				campoPrecoDeCompra.setText("");
				campoPrecoDeVenda.setText("");

				// TODO FAZER AÇÃO DO BOTÃO CADASTRAR
			}
		}

 

Mas esse metódo cadastraProduto() eu faria onde(qual arquivo)?

Link para o comentário
Compartilhar em outros sites

@Renanzinthhh Você pode fazer exatamente o que falei se alterar seu código.

 

Você criou uma interface para chamar o método de validação. Certo. Mas ele está no local errado. Colocar um método de validação de tela dentro do objeto de dados não é bom.

 

Você possui uma classe ProdutoDAO. Além de fazer acesso ao banco para ler e gravar dados, essa classe atua como uma model, onde todos os métodos de negócio (validações, consultas, etc) tem que estar. Implemente a interface nessa classe.

 

Dentro dela você terá os métodos de validação do produto e gravação em banco de dados.

 

Eu fiz o exemplo tudo dentro da mesma classe. Esse método de cadastra produto foi só pra demonstrar que você pode jogar livremente com métodos e classes, mas mantendo lógica e seguindo padrões de boa programação.

 

public ProdutoDAO implements InterfaceDeValidacao {
 
  public ProdutoDAO (DataBaseConnector dbc) {
    //método do construtor
  }
  
  public validaProdutoPorDescricao(String descricao) {
   //método de validação 
  }
  
  public void registra(DataProduto dp) {
   //método de gravação em banco de dados
  }  
}

E na classe que você apresentou inicialmente com o código do JButton, pode fazer isso:

 

private ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());

public void actionPerformed(ActionEvent e) {
	if (prodao.validaProdutoPorDescricao(campoDescricao.getText()) {
		cadastraProduto();	     
    } else {
      JOptionPane.showMessageDialog(null, "Produto com nome inválido");
    }
}

//Este método pode estar na mesma classe onde você desenhou a tela
private void cadastraProduto() {
	Produto prod = new Produto();
    prod.setDescricao(campoDescricao.getText());
    prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
    prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
    prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));

    prodao.registra(prod);

    campoDescricao.setText("");
    campoSaldoEstoque.setText("");
    campoPrecoDeCompra.setText("");
    campoPrecoDeVenda.setText("");  
}

Viu como simples mudanças deixaram o código mais fácil de ler e delegamos funções específicas para cada método? Claro, poderíamos dividir ainda mais as coisas em métodos especializados mas o código é pequeno e não teria necessidade, mas para fins de aprendizado é interessante.

 

O que eu fiz é a melhor alternativa? Não. É a única? Também não. 

 

Agora, tente imaginar esse programa crescendo. Cadastro de produtos, clientes, controle de estoque, vendas, etc. É necessário estruturar o software antes de começar a escrever código para que exista um padrão nele. Dessa forma, você sabe que tipo de métodos vai encontrar nas classes DAO de cada parte do sistema, a estrutura de cada BO e quais seriam os métodos comuns a cada tela e como criar uma interface para gerenciar telas.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...