RESOLVIDO: JavaFX - Atualizar TableView após update em outro FXML

Galera, tenho 2 FXML, o primeiro com a TableView sendo carregada por um ObservableList:

ObservableList<recebimentoDivergencia> divergencia = FXCollections.observableArrayList(rcdDAO.obterTabelaCriterio(txtFiltro1.getSelectionModel().getSelectedItem(), txtCriterio1.getText(), txtFiltro2.getSelectionModel().getSelectedItem(), txtCriterio2.getText()));
        tblViewDivergencia.setItems(divergencia);

Esse “rcdDAO.obterTabelaCriterio(******” está na minha classe DAO:

public ObservableList<recebimentoDivergencia> obterTabelaCriterio(String Filtro1, String criterio1, String Filtro2, String criterio2) {
        ObservableList<recebimentoDivergencia> lista = FXCollections.observableArrayList();
        Connection conn = Conexao.getConnection();
        Statement stmt = null;
        ResultSet rs = null;
        String sql = "SELECT * FROM recebdivergencia "
                + " WHERE " + Filtro1 + " LIKE '%" + criterio1 + "%' "
                + " AND " + Filtro2 + " LIKE '%" + criterio2 + "%' "
                + " ORDER BY cod DESC LIMIT 5000";
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                recebimentoDivergencia bean = new recebimentoDivergencia();

                bean.setCod(rs.getInt("cod"));
                bean.setDataRecebimento(rs.getString("dataRecebimento"));
                bean.setNf(rs.getString("nf"));
                bean.setFornecedor(rs.getString("fornecedor"));
                bean.setTransportadora(rs.getString("transportadora"));
                bean.setPlaca(rs.getString("placa"));
                bean.setMaterial(rs.getString("material"));
                bean.setDescricao(rs.getString("descricao"));
                bean.setQtdeNF(rs.getInt("qtdeNF"));
                bean.setQtdeFisica(rs.getInt("qtdeFisica"));
                bean.setDiferenca(rs.getInt("diferenca"));
                bean.setTipo(rs.getString("tipo"));

                bean.setImg1Bloob(rs.getBlob("Foto1"));
                if (bean.getImg1Bloob() != null) {
                    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bean.getImg1Bloob().getBytes(1, (int) bean.getImg1Bloob().length()));
                    bean.setImg1Foto(new Image(byteArrayInputStream));
                } else {
                    bean.setImg1Foto(new Image("/br/com/pcp/img/foto-icon.png"));
                }

                bean.setImg2Bloob(rs.getBlob("Foto2"));
                if (bean.getImg2Bloob() != null) {
                    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bean.getImg2Bloob().getBytes(1, (int) bean.getImg2Bloob().length()));
                    bean.setImg2Foto(new Image(byteArrayInputStream));
                } else {
                    bean.setImg2Foto(new Image("/br/com/pcp/img/foto-icon.png"));
                }

                bean.setConferente(rs.getString("conferente"));
                bean.setObsOperacao(rs.getString("obsOperacao"));
                bean.setLote(rs.getString("lote"));
                bean.setStatusOperacao(rs.getString("statusOperacao"));
                bean.setCustoUnitario(rs.getDouble("custoUnitario"));
                bean.setCustoTotal(rs.getDouble("custoTotal"));
                bean.setStatusMWM(rs.getString("statusMWM"));
                bean.setObsMWM(rs.getString("obsMWM"));
                bean.setFollowup(rs.getString("followup"));
                bean.setDataSolucao(rs.getString("dataSolucao"));
                bean.setNotaDebito(rs.getInt("notaDebito"));
                bean.setBloqueioSAP(rs.getString("bloqueioSAP"));

                lista.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Conexao.close((com.mysql.jdbc.Connection) conn, stmt, rs);
        } finally {
            Conexao.close((com.mysql.jdbc.Connection) conn, stmt, rs);
        }
        return lista;
    }

E o 2º é um fxml separado onde abro tipo um pop-up para alteração dos dados (Insert ou Update).
Até aqui tudo OK e funcionando perfeitamente.

O problema é que ao dar 2 cliques numa linha da TableView eu abro o 2º fxml preencho os campos e faço o Update, ao finalizar o update esse 2º fxml fecha e a tela que tem TableView volta em primeiro plano mas a TableView não se atualiza automaticamente com os dados que acabei de alterar, sou obrigado a clicar no botão para atualizar, :thinking: como faço para que a TableView atualize automaticamente quando eu fechar a 2º fxml dos campos?

Cara, JavaFX tá muito bonito, eu to apanhando pra caramba pra conseguir pegar as manhas dele.

Dá uma olhada nesse tópico, fala sobre atualizar a janela A quando fechar a B:

@rodriguesabner show de bola, era isso mesmo que precisava, obrigado pela ajuda, segue solução:

Método que popula a TableView, está no controller do fxml PAI:

public void tblViewDivergenciaSearch() {
        tblViewDivergencia.getItems().clear();
        tblClmCod.setCellValueFactory(new PropertyValueFactory<>("cod"));
        tblClmDatarecebimento.setCellValueFactory(new PropertyValueFactory<>("dataRecebimento"));
        tblClmNf.setCellValueFactory(new PropertyValueFactory<>("nf"));
        tblClmFornecedor.setCellValueFactory(new PropertyValueFactory<>("fornecedor"));
        tblClmTransportadora.setCellValueFactory(new PropertyValueFactory<>("transportadora"));
        tblClmPlaca.setCellValueFactory(new PropertyValueFactory<>("placa"));
        tblClmMaterial.setCellValueFactory(new PropertyValueFactory<>("material"));
        tblClmDescricao.setCellValueFactory(new PropertyValueFactory<>("descricao"));
        tblClmQtdenf.setCellValueFactory(new PropertyValueFactory<>("qtdeNF"));
        tblClmQtdefisica.setCellValueFactory(new PropertyValueFactory<>("qtdeFisica"));
        tblClmDiferenca.setCellValueFactory(new PropertyValueFactory<>("diferenca"));
        tblClmTipo.setCellValueFactory(new PropertyValueFactory<>("tipo"));
        tblClmFoto1.setCellValueFactory(new PropertyValueFactory<>("img1Foto"));
        tblClmFoto2.setCellValueFactory(new PropertyValueFactory<>("img2Foto"));
        tblClmConferente.setCellValueFactory(new PropertyValueFactory<>("conferente"));
        tblClmObsoperacao.setCellValueFactory(new PropertyValueFactory<>("obsOperacao"));
        tblClmLote.setCellValueFactory(new PropertyValueFactory<>("lote"));
        tblClmStatusoperacao.setCellValueFactory(new PropertyValueFactory<>("statusOperacao"));
        tblClmCustounitario.setCellValueFactory(new PropertyValueFactory<>("custoUnitario"));
        tblClmCustototal.setCellValueFactory(new PropertyValueFactory<>("custoTotal"));
        tblClmStatusmwm.setCellValueFactory(new PropertyValueFactory<>("statusMWM"));
        tblClmObsmwm.setCellValueFactory(new PropertyValueFactory<>("obsMWM"));
        tblClmFollowup.setCellValueFactory(new PropertyValueFactory<>("followup"));
        tblClmDatasolucao.setCellValueFactory(new PropertyValueFactory<>("dataSolucao"));
        tblClmNotadebito.setCellValueFactory(new PropertyValueFactory<>("notaDebito"));
        tblClmBloqueiosap.setCellValueFactory(new PropertyValueFactory<>("bloqueioSAP"));

        ObservableList<recebimentoDivergencia> divergencia = FXCollections.observableArrayList(rcdDAO.obterTabelaCriterio(txtFiltro1.getSelectionModel().getSelectedItem(), txtCriterio1.getText(), txtFiltro2.getSelectionModel().getSelectedItem(), txtCriterio2.getText()));
        tblViewDivergencia.setItems(divergencia);
    }

Ao dar 2 cliques numa linha da tableView chamo o fxml FILHO que faz a edição de dados:

                    fxmlLoader.load();
                    Parent parent = fxmlLoader.getRoot();
                    Scene scene = new Scene(parent);
                    scene.setFill(new Color(0, 0, 0, 0));

                    //Instancia o controller da tela viewDetail
                    viewDivergenciaDetailController vdController = fxmlLoader.getController();
                    vdController.setUsuarioLogado(usuarioLogado);//Passa o usuário para o método da tela viewDetail
                    vdController.permissao();
                    vdController.carregaCampos(selectedDivergencia.getCod());//Passa para a tela viewDetail o id do registro selecionado na table

                    //Abre o formulário viewDetail
                    Stage nStage = new Stage();
                    nStage.setScene(scene);
                    nStage.initModality(Modality.APPLICATION_MODAL);
                    nStage.initStyle(StageStyle.TRANSPARENT);

                    //Aqui esá o pulo do gato
                    //Seta o método que atualiza a table ao formulário de edição quando identificar o evento de fechar
                    nStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
                        public void handle(WindowEvent we) {
                            tblViewDivergenciaSearch();//Esse método eu populo o tableView (ver acima)
                        }
                    });

                    //Abre o formulário
                    nStage.show();

No formulário FILHO faço a edição nos campos e salvo, ai no ActionEvent do botão “Sair” que está no controller do fxml FILHO coloco o seguinte código:

@FXML
    private void btnSairOnAction(ActionEvent event) {
        Stage stage = (Stage) btnSair.getScene().getWindow();

        //Aqui está o pulo do gato onde vai fazer o tableView do fxml PAI atualizar
        stage.getOnCloseRequest().handle(new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST));

        //Fecha este formulário FILHO
        stage.close();
    }

Show, agora tudo funcionando!
:+1: