Passar Objeto entre telas JavaFX

Estou tentando a muito tempo tentar passar um objeto de uma tela para outra com o JavaFX, mas sempre diz que o objeto está nulo.

Qual o comportamento dos metodos anotados com @FXML e em que momento o metodo
public void initialize(URL fxmlFileLocation, ResourceBundle resources) é chamado

A tag @FXML dá acesso pro fxml loader em campos/métodos privados, como se, para o fxmlloader estes fossem públicos. O método initializable é chamado pelo fxml loader depois que toda a classe foi carregada (que o objeto foi criado, no caso o controller).

src:

By using a @FXML annotation on
a member, you are declaring that the FXML loader can access the member even if it is private. A public
member used by the FXML loader does not need to be annotated with @FXML.

e

The FXML loader will call the
initialize() method after the loading of the FXML document is complete.

do livro Learn JavaFX 8 do Kishori Sharan

1 curtida

imagino que você construiu sua tela com 3 arquivos… Tela1.java, Tela1Controller.java, e tela1.fxml, certo?
suponha que a tela2 tenha as mesmas especificações. Se seu objeto está armazenado no Tela1Controller.java ele deve ser acessível pelo Tela2Controller.java… O objeto controller (e consequentemente sua variavel) da tela1 pode ser capturado assim…
Método start() da Tela1…

public Tela1Controller controller;

@Override
public void start(Stage stage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(this.getClass().getSimpleName() + “.fxml”));
Parent root = (Parent) loader.load();
this.controller = (Tela1Controller) loader.getController(); //Essa é a linha importante, é onde você captura o objeto atual que representa seu controller

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.showAndWait();
    } catch (Exception ex) {
        Alerta.mostra(ex.getMessage());
    }
}  

Para acessar esse controller da Tela2 fica assim:

Tela1 t = new Tela1();
t.start(new Stage()); //só a partir dessa linha é que o controller da Tela1 estará disponível para você pegar as variáveis dele
t.controller.getVariavelQueEuQuero(); <-- é isso que você quer

1 curtida

Muito obrigado man, isso me ajudou muito.