Boa tarde amigos,
Estou desenvolvendo uma aplicação para lanchonetes utilizando o JavaFX e JPA. Ao inserir um produto no banco a tabela não está sendo atualizada automaticamente, mesmo utilizando o conceito de ObservableList… Segue o código abaixo:
Persistindo produto (Controller do formulário):
@FXML
public void handleBtSalvarProduto() {
ProdutoDAO pdao = new ProdutoDAO();
Produto produto = new Produto();
produto.setNome(tfNomeProduto.getText());
produto.setPreco(tfPrecoProduto.getValue());
produto.setTipoProduto(cbTipoProduto.getSelectionModel().getSelectedItem());
produto.setEnderecoImagem(tfImagemProduto.getText());
produto.setAdicionais(lvItensAdicionais.getItems());
produto.setAtivo(ckbSituacaoProduto.isSelected());
if (pdao.persist(produto)) {
Alert dialogo = new Alert(Alert.AlertType.INFORMATION);
dialogo.setTitle("STAY HAMBURGUERIA PREMIUM");
dialogo.setHeaderText("Cadastro de Produtos");
dialogo.setContentText("Produto adicionado com sucesso!");
dialogo.showAndWait();
} else {
Alert dialogo = new Alert(Alert.AlertType.ERROR);
dialogo.setTitle("Stay Hamburgueria Premium.");
dialogo.setHeaderText("Cadastro de Produtos.");
dialogo.setContentText("O produto já existe no sistema.");
dialogo.showAndWait();
}
redefinirLayout();
}
Recuperando lista de produtos (ProdutoDAO)
public boolean persist(Produto produto) {
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
boolean b = false;
try {
if (produto.getId() == null) {
em.persist(produto);
b = true;
} else {
b = false;
}
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
em.close();
}
return b;
}
Classe para carregamento de dados:
public abstract class DataLoader {
public static ObservableList<ProdutoGenerico> getListaProdutosGenericos() {
ProdutoDAO pdao = new ProdutoDAO();
List<ProdutoGenerico> genericos = new ArrayList<>();
List<Produto> produtos = pdao.getList();
for (Produto p : produtos) {
genericos.add(new ProdutoGenerico(p));
}
return FXCollections.observableArrayList(genericos);
}
public static ObservableList<ProdutoGenerico> getListaAdicionaisGenericos() {
ProdutoDAO pdao = new ProdutoDAO();
List<ProdutoGenerico> genericos = new ArrayList<>();
List<Produto> produtos = pdao.getListAdicionais();
for (Produto p : produtos) {
genericos.add(new ProdutoGenerico(p));
}
return FXCollections.observableArrayList(genericos);
}
Método para configurar o TableView no controle:
public void configurarLayout() {
cbTipoProduto.getItems().addAll(TipoProduto.values());
ckbSituacaoProduto.setSelected(true);
// Configurando o TableView
clNome.setCellValueFactory(new PropertyValueFactory<>("nome"));
clPreco.setCellValueFactory(new PropertyValueFactory<>("preco"));
clSituacao.setCellValueFactory(new PropertyValueFactory<>("ativo"));
clTipo.setCellValueFactory(new PropertyValueFactory<>("tipoProduto"));
atualizarLista();
tvProdutos.setItems(DataLoader.getListaProdutosGenericos());
}
Sempre que um produto é inserido eu preciso fechar a janela e abrir novamente para que a tabela seja atualizada. Alguma dica?