Bom dia a Todos.
Tenho um formulário de cadastro de cliente com um textField e um botão que abre um formulário de pesquisar cliente. Ao finalizar a consulta, fecho a tela de consulta e envio o resultado para o método initialize do 1º formulário que se encontrava aberto, isso através do ResourceBundle. Até ai tudo bem, no console eu imprimo o valor da consulta. Mas não consigo setar esse valor no textField. Ou seja, acredito que dever ter uma maneira de atualizar essa tela.
Esse método initialize é do form1 que já estava aberto e recebe o valor vindo do form2, que foi fechado. Repetindo, no console imprime o valor certo, mas o textField não aparece o valor.
Isso é bem simples;
Baixa esse Zip, e veja no Main.java
controller.setApplication(this);
Esse metodo pode ter qualquer nome e nele voce passa a referencia do programa principal.
Então dentro do Controller terá acesso geral a qualquer instancia ou objeto do seu sistema.
Bons Codigos
S
Supla_29
Boa tarde.
Eu tentei adaptá-lo ao meu código mas não consegui.
Na verdade eu estou criando um sistema de controle de estoque, venda etc, pra uso pessoal mesmo. Vou postar os código que exemplifica meu problema.
Através do método initialize da Classe CadastroClienteControle eu consigo receber o valor vindo do outro controler e imprimir no consome, mas no textField ele não seta o valor, tipo não atualiza o textField. Na minha tela de cadastro eu tenho outros textField já preenchido, ai se abrir outra tela eu perco o que ja preenchido.
ClassePrincipal
publicclassClassePrincipalextendsApplication{@Overridepublicvoidstart(Stagestage)throwsException{ParentpaginaPrincipal=FXMLLoader.load(getClass().getResource("/visao/CadastroCliente.fxml"));Scenescene=newScene(paginaPrincipal);stage.setScene(scene);stage.setResizable(false);stage.setTitle("Cadastro de Clientes");stage.show();}publicstaticvoidmain(String[]args){launch(args);}}
publicclassPesquisarClienteControleimplementsInitializable{ClienteModeloclienteModelo;ClienteDaoclienteDao;@FXMLprivateAnchorPaneanchorPanePesquisarCliente;@FXMLprivateTextFieldtxtPesquisarCliente;@FXMLprivateTableView<ClienteModelo>tblCliente;@FXMLprivateTableColumn<ClienteModelo,String>clmCliente;privateObservableList<ClienteModelo>observableListaDeCliente=FXCollections.observableArrayList();@FXMLvoidtblClienteAction(MouseEventevent)throwsIOException{if(event.getClickCount()==2){getCliente();//final Stage stage = new Stage();ResourceBundlerb=newResourceBundle(){@OverrideprotectedObjecthandleGetObject(Stringkey){if(key.contains("NomeCliente")){returnclienteModelo.getCliente();}else{returnnull;}}@OverridepublicEnumeration<String>getKeys(){returnnull;}};FXMLLoaderfxmlLoader=newFXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"),rb);Parentparent=(Parent)fxmlLoader.load();//CadastroClienteControle cadastroClienteControle = fxmlLoader.getController();//fxmlLoader.setController(cadastroClienteControle);//Scene scene = new Scene(parent);//stage.setScene(scene);//stage.show();finalStagestage=(Stage)txtPesquisarCliente.getScene().getWindow();stage.close();//cadastroClienteControle.setCliente(clienteModelo);}}privateObservableList<ClienteModelo>carregarTabelaCliente(){try{clienteDao=newClienteDao();}catch(SQLExceptionex){Logger.getLogger(PesquisarClienteControle.class.getName()).log(Level.SEVERE,null,ex);}observableListaDeCliente=FXCollections.observableArrayList(clienteDao.listarCliente());returnobservableListaDeCliente;}privatevoidgetCliente(){clienteModelo=tblCliente.getSelectionModel().getSelectedItem();}@Overridepublicvoidinitialize(URLurl,ResourceBundlerb){clmCliente.setCellValueFactory(newPropertyValueFactory<ClienteModelo,String>("Cliente"));tblCliente.setItems(carregarTabelaCliente());}}
j-menezes1 like
Se voce deseja que Eu ou alguem reproduza o seu codigo precisa colocar o programa com tudo que for necessario.
Onde estão os arquivos .fxml?
Sugiro voce criar um exemplo simples onde fique nitido esse seu problema.
Mas se voce notar com calma o que Eu já respondi vai ver que resolve sua questão.
Em cada Controller voce precisa criar um metodo setApplication
FXMLLoader fxml = new FXMLLoader( getClass().getResource(“Sample.fxml”) );
publicclassClienteDao{privatefinalConnectionconnection;privateStatementst=null;publicResultSetrs=null;publicClienteDao()throwsSQLException{this.connection=newConnectionFactory().getConnection();}publicList<ClienteModelo>listarCliente(){Stringsql="select * from CadastroCliente order by nomeCliente";List<ClienteModelo>cliente=newArrayList<>();try{PreparedStatementps=connection.prepareStatement(sql);rs=ps.executeQuery();while(rs.next()){ClienteModeloclienteModelo=newClienteModelo();clienteModelo.setCliente(rs.getString("nomeCliente"));cliente.add(clienteModelo);}}catch(SQLExceptionex){//Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);//JOptionPane.showMessageDialog(null, "Erro ao Adicionar");}returncliente;}}
Boa noite, reproduzi o exemplo do problema com menos código e sem conexão com banco.
ClassePrincipal
publicclassClassePrincipalextendsApplication{@Overridepublicvoidstart(Stagestage)throwsException{FXMLLoaderfxmlLoader=newFXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"));AnchorPanepaginaPrincipal=fxmlLoader.load();CadastroClienteControlecadastroClienteControle=fxmlLoader.getController();cadastroClienteControle.setApplication(this);Scenescene=newScene(paginaPrincipal);stage.setScene(scene);stage.setResizable(false);stage.setTitle("Cadastro de Clientes");stage.show();}publicstaticvoidmain(String[]args){launch(args);}}
Fiz esse outro exemplo, veja se é algo similar a isso que voce quer fazer
JavaFX 21
JDK >= 17
j-menezes
Segue o seu ultimo exemplo.
Em tese funciona assim :
1-Uma Tela principal do Sistema (esse e’ o modulo principal que será visivel para toda fxml ou não, que precisar trocar algumas informações com ele). Essa é uma forma elegante de comunicação total com o sistema.
2-ResourceBundle tem sua utilidade principalmente quando os dados estão em um arquivo de properties, mas usar um objeto DAO no caso, parece ser melhor escolha.
3-Se seu sistema tiver processamento interno em uma Thread separada, no momento de persistir nos Nós do JavaFX nao esqueça de usar o Platform.runLater.
S
Supla_29
Bom dia, esse método que vc me passou consegui fazer ele funcionar no meu exemplo. Vou utilizar ele no projeto do meu sistema de controle de venda e estoque.
Vou te fazer uma pergunta, nesse exemplo de código que vou que postar, qual é a lógica pra funcionar.
ClassePrincipal
publicclassClassePrincipalextendsApplication{@Overridepublicvoidstart(Stagestage)throwsException{FXMLLoaderfxmlLoader=newFXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"));AnchorPanepaginaPrincipal=fxmlLoader.load();Scenescene=newScene(paginaPrincipal);stage.setScene(scene);stage.setResizable(false);stage.setTitle("Cadastro de Clientes");stage.show();}publicstaticvoidmain(String[]args){launch(args);}}
publicclassPesquisarClienteControleimplementsInitializable{@FXMLprivateAnchorPaneanchorPanePesquisarCliente;@FXMLprivateTextFieldtxtPesquisarCliente;@FXMLprivateButtonbtnOk;@FXMLvoidbtnOkAction(ActionEventevent)throwsIOException{FXMLLoaderfxmlLoader=newFXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"));Parentparent=(Parent)fxmlLoader.load();CadastroClienteControlecadastroClienteControle=fxmlLoader.getController();cadastroClienteControle.setCliente(txtPesquisarCliente.getText());//fxmlLoader.setController(cadastroClienteControle);//Scene scene = new Scene(parent);//stage.setScene(scene);//stage.show(); finalStagestage=(Stage)txtPesquisarCliente.getScene().getWindow();stage.close();}@Overridepublicvoidinitialize(URLlocation,ResourceBundleresources){txtPesquisarCliente.setText("Junior");}}