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.
@Override
public void initialize(URL url, ResourceBundle rb) {
if (rb != null) {
txtCliente.setText(rb.getString("NomeCliente"));
System.out.println(rb.getString("NomeCliente"));
}
}
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
public class ClassePrincipal extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent paginaPrincipal = FXMLLoader.load(getClass().getResource("/visao/CadastroCliente.fxml"));
Scene scene = new Scene(paginaPrincipal);
stage.setScene(scene);
stage.setResizable(false);
stage.setTitle("Cadastro de Clientes");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
CadastroClienteControle
public class CadastroClienteControle implements Initializable {
ClienteModelo clienteModelo;
Date data = new Date();
SimpleDateFormat data1 = new SimpleDateFormat("dd/MM/yyyy");
@FXML
private AnchorPane anchorPaneCadastroCliente;
@FXML
private TextField txtData;
@FXML
private TextField txtCliente;
@FXML
private Button btnPesquisar;
@FXML
void btnPesquisarAction(ActionEvent event) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/visao/PesquisarCliente.fxml"));
AnchorPane root = fxmlLoader.load();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setTitle("Pesquisar Cliente");
stage.setScene(scene);
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);
stage.show();
}
public void setCliente(ClienteModelo clienteModelo) {
this.clienteModelo = clienteModelo;
txtCliente.setText(clienteModelo.getCliente());
}
@Override
public void initialize(URL url, ResourceBundle rb) {
if (rb != null) {
txtCliente.setText(rb.getString("NomeCliente"));
System.out.println(rb.getString("NomeCliente"));
}
txtData.setText(data1.format(data));
}
}
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”) );
exemplo
FXMLLoader fxml = new FXMLLoader( getClass().getResource("Sample.fxml") );
AnchorPane root= (AnchorPane)fxml.load();
SampleController controller = fxml.getController(); // <--- Obtem o Controller
controller.setApplication(this); // <--- aqui vai o seu Programa principal dentro do Controller
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.
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
public class ClassePrincipal extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"));
AnchorPane paginaPrincipal = fxmlLoader.load();
Scene scene = new Scene(paginaPrincipal);
stage.setScene(scene);
stage.setResizable(false);
stage.setTitle("Cadastro de Clientes");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
CadastroClienteControle
public class CadastroClienteControle implements Initializable {
@FXML
private AnchorPane anchorPaneCadastroCliente;
@FXML
private TextField txtId;
@FXML
private TextField txtCliente;
@FXML
private Button btnPesquisar;
@FXML
void btnPesquisarAction(ActionEvent event) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/visao/PesquisarCliente.fxml"));
AnchorPane root = fxmlLoader.load();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setTitle("Pesquisar Cliente");
stage.setScene(scene);
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);
stage.show();
}
public void setCliente(String cliente) {
txtCliente.setText(cliente);
}
@Override
public void initialize(URL location, ResourceBundle resources) {
txtId.setText("01");
}
}
PesquisarClienteControle
public class PesquisarClienteControle implements Initializable {
@FXML
private AnchorPane anchorPanePesquisarCliente;
@FXML
private TextField txtPesquisarCliente;
@FXML
private Button btnOk;
@FXML
void btnOkAction(ActionEvent event) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/visao/CadastroCliente.fxml"));
Parent parent = (Parent) fxmlLoader.load();
CadastroClienteControle cadastroClienteControle = fxmlLoader.getController();
cadastroClienteControle.setCliente(txtPesquisarCliente.getText());
//fxmlLoader.setController(cadastroClienteControle);
//Scene scene = new Scene(parent);
//stage.setScene(scene);
//stage.show();
final Stage stage = (Stage) txtPesquisarCliente.getScene().getWindow();
stage.close();
}
@Override
public void initialize(URL location, ResourceBundle resources) {
txtPesquisarCliente.setText("Junior");
}
}