help with sales system

I have a sales system, where the user must choose the product he wants to buy, inform the quantity, the system automatically loads the unit value and also multiplies between quantity and unit value, thus generating the total value of that chosen item

What I would like is that, when the user finishes choosing each item, he will click on the Add Product button, the product must go to the grid and the form must be cleared so that the user can add a second product if he so wishes

I am not able to make this form clean, I don’t know where the error is. If anyone can help me make sure the form is cleaned with each click, I will be grateful

my code so far:

private void janelaModalVendas() {

		modalVendas.open();
		modalVendas.setHeight("420px");
		modalVendas.setWidth("500px");

		layoutVendaDeProdutosModal.add(txtProdutos, txtQuantidade, txtValorUnitario, txtValorTotalDoItem,
				hltBarraBotoesModal);

		modalVendas.add(layoutVendaDeProdutosModal);

		hltBarraBotoesModal.add(btnAddProduto, btnFecharModal);

		List<Produto> listaDeProdutos = produtoRepository.findAll();
		txtProdutos.setItemLabelGenerator(Produto::getNome);
		txtProdutos.setItems(listaDeProdutos);
		txtProdutos.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));

			try {

				txtValorUnitario.setValue(formatter.format(event.getValue().getValor()));

			} catch (Exception e) {
				e.printStackTrace();
			}

		});

		txtQuantidade.setHasControls(true);
		txtQuantidade.setValue(null);
		txtQuantidade.setMin(1);
		txtQuantidade.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));

			double valorTotal = 0;
			try {
				valorTotal = formatter.parse(txtValorUnitario.getValue()).doubleValue() * txtQuantidade.getValue();
			} catch (ParseException e) {

				e.printStackTrace();
			}

			txtValorTotalDoItem.setValue(formatter.format(valorTotal));

			double soma = 0;
			for (TextField tf : valores) {
				try {
					soma += formatter.parse(tf.getValue()).doubleValue();

				} catch (ParseException e) {

					e.printStackTrace();
				}

			}

			campoSomaValores.setValue(formatter.format(soma));

		});

		btnAddProduto.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnAddProduto.getStyle().set("margin-top", "20px");
		btnAddProduto.addClickListener(e -> {

			produtoVendido.setProduto(txtProdutos.getValue());
			produtoVendido.setQuantidade(txtQuantidade.getValue().intValue());
			NumberFormat formatacao = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			try {
				produtoVendido
						.setValorTotalDoItem(formatacao.parse(txtValorTotalDoItem.getValue().toString()).doubleValue());
			} catch (ParseException e1) {

				e1.printStackTrace();
			}

			venda.addProduto(produtoVendido.getProduto(), produtoVendido.getQuantidade(),
					produtoVendido.getProduto().getValor(), produtoVendido.getValorTotalDoItem());

			grid.getDataProvider().refreshAll();
			addClickModal();
			
			binderProdutoVendido.getFields().forEach(f -> f.clear());

		});

		btnFecharModal.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnFecharModal.getStyle().set("margin-top", "20px");
		btnFecharModal.addClickListener(e -> {
			modalVendas.close();

		});

		valores.add(txtValorTotalDoItem);

	}