TableView não atualiza automaticamente no JavaFX + JPA ?

1 resposta
jpajavafx
R

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?

1 Resposta

A

Olá, você está usando setItens, tem duas opções que provavelmente irão resolver:

1- Use clear e addAll

tvProdutos.getItems().clear();
tvProdutos.getItems().addAll(lista);

2 - Dê um refresh na tabela (se usa Java 8u60):

tvProdutos.refresh();
Criado 4 de maio de 2017
Ultima resposta 5 de mai. de 2017
Respostas 1
Participantes 2