Vinícius, basicamente o que vc precisa fazer é enviar informações de um controller para o outro, e de acordo com as boas práticas recomendadas pela oracle isto deve ser feito utilizando ResourceBundle.
Bom vc instancia um ResourceBundle e joga nele qualquer coisa que será utilizada no outro controller e recebe esses dados no método initialize do controller para o seu arquivo fxml.
Eu procurei a documentação aqui e não encontrei, pq eles alteraram algumas coisas do lançamento do javafx 2.0 para as versões subsequentes e acho que estão corrigindo, mas acho que aqui no grupo mesmo tem alguns tópicos mais antigos sobre isso. Vou postar aqui um exemplo simples que tenho em uma aplicação que fiz mas seguindo a documentação ainda do lançamento, na verdade eu não sei ao certo o que mudou, mas esse código ainda funciona.
//instancia o ResourceBundle colocando qualquer objeto que vc irá precisar acessar no outro controller
//neste exemplo eu crio um stage e crio o resourcebundle e adiciono o stage no resourcebundle
final Stage stage = new Stage(StageStyle.DECORATED);
ResourceBundle rb = new ResourceBundle() {
@Override
protected Object handleGetObject(String key) {
if (key.contains("receitas")) {
return cli.getReceitas();
} else if (key.contains("stage")) {
return stage;
} else if (key.contains("view")) {
return "venda";
} else {
return null;
}
}
@Override
public Enumeration<String> getKeys() {
throw new UnsupportedOperationException("Not supported yet.");
}
};
Depois vc precisa adicionar o resourcebundle para o seu fxml e scene:
AnchorPane secondaryLayout = (AnchorPane) FXMLLoader.load(appotica_v2.AppOtica_v2.class.getResource("/view/receita.fxml"), rb, new JavaFXBuilderFactory());
Scene scene2 = new Scene(secondaryLayout, 1366, 768);
scene2.getStylesheets().add(AppOtica_v2.class.getResource("estilo.css").toExternalForm());
stage.setScene(scene2);
stage.show();
A partir do momento que vc chamou o método show() vc "pega" o resourcebundle no seu controller (no seu caso, pelo que entendi no controller do form2) no método initialize:
// initialize your logic here: all @FXML variables will have been injected
if (resources != null) {
if (resources.getObject("receitas") != null) {
receitas = (Set<Receita>) resources.getObject("receitas");
carregarTabela();
carregarGraficos();
}
if (resources.getObject("stage") != null) {
stage = (Stage) resources.getObject("stage");
}
if (resources.getObject("view") != null) {
view = (String) resources.getObject("view");
}
}
Bom essa é umas das formas de ser feito, e como eu disse teve algumas modificações nas versões mais recentes, mas logo no lançamento da versão 2.0 era uma das formas recomendadas de se fazer comunicação entre controllers. Se eu não me engano, acho que já na versão 2.0 do scene builder, o gerador de classe controller já gera uma variável resourcebundle sem vc precisar fazer nada no metodo initialize.
Não sei se ficou claro, mas espero ter ajudado.
Junior Tada