Javafx 将变量从FXML获取到导入的FXML

Javafx 将变量从FXML获取到导入的FXML,javafx,fxml,Javafx,Fxml,我目前正在为我的研究做一个Java(+使用MySQL)应用程序:一个用于医院的数据库 我使用JavaFX编写接口代码。 我有一个主FXML(用于常规视图),其中有选项卡,在每个选项卡中,我使用(fx:include)导入另一个FXML。因此,我的应用程序的每个模块都有自己的控制器和自己设计的视图 如何将变量从主控制器传递到其他控制器 谢谢! 编辑:让我给你看我的代码 首先,我在类中加载我的fxml(我首先在连接窗口中加载,如果连接所需的信息正常,我将使用主接口加载fxml Main),然后将从f

我目前正在为我的研究做一个Java(+使用MySQL)应用程序:一个用于医院的数据库

我使用JavaFX编写接口代码。 我有一个主FXML(用于常规视图),其中有选项卡,在每个选项卡中,我使用(fx:include)导入另一个FXML。因此,我的应用程序的每个模块都有自己的控制器和自己设计的视图

如何将变量从主控制器传递到其他控制器

谢谢! 编辑:让我给你看我的代码

首先,我在类中加载我的fxml(我首先在连接窗口中加载,如果连接所需的信息正常,我将使用主接口加载fxml Main),然后将从fxml连接中获取的连接(我需要发送的变量)设置为fxml Main

public class MainApp extends Application {

private Stage primaryStage;
private Connection conn;
MainController controllermain = new MainController();
//ConnexionController controllerconnex;

@Override
public void start(Stage primaryStage) throws Exception {
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("BASE DE L'HOPITAL DU ZOB");
    showConnexion();
}

public void showConnexion() {
    try {

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainApp.class.getResource("Connexion.fxml"));
        Parent page = (AnchorPane) loader.load();
        Scene scene = new Scene(page);

        primaryStage.setScene(scene);
        primaryStage.show();

        ConnexionController controller = loader.getController();
        controller.setMainApp(this);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void showMainApp(Connection conn) {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainApp.class.getResource("Main.fxml"));
        AnchorPane page = (AnchorPane) loader.load();
        Scene scene = new Scene(page);
        primaryStage.setScene(scene);
        primaryStage.show();
        this.conn = conn;

        controllermain = loader.getController();
        controllermain.setMainApp(this);
        controllermain.setConnexion(conn); // I want to send the variable conn to the others

    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}
}

这是我的主控制器,你可以看到,我只使用set方法获取变量connexion,然后我可以将它发送给另一个控制器

public class MainController implements Initializable {


private MainApp mainApp;
private Button retour;
protected Connection conn;


FXML AchorPane ;

   public MainController() {
}

@Override
public void initialize(URL url, ResourceBundle rb) {

}    


 public void setMainApp(MainApp mainApp) {
    this.mainApp = mainApp;


}

 public void setConnexion(Connection conn){

 this.conn=conn;

     }
public void handleRetour(){
                       mainApp.showConnexion();


    }
 }     


}

您只需要在与“main”fxml对应的控制器中引用与包含的fxml对应的控制器。您可以使用该机制执行此操作

简而言之,如果您有一个带有
标记的“main”fxml,请在
中添加一个
fx:id

Main.fxml:

<!-- imports etc -->

<!-- root element, e.g. BorderPane -->
<BorderPane fx:controller="com.example.MainController" xmlns="..." ... >

<!-- ... -->

<fx:include source="tab.fxml" fx:id="tab" />

<!-- ... -->
</BorderPane>

现在只需在
TabController
(如果您还没有)中定义
setConnexion(…)
方法,即可接收
连接
对象(并更新结果中需要更新的任何内容)。

是的,非常感谢!但是,如果在调用initialize方法之前我没有想要设置的变量,这仍然是可能的,或者没有其他方法?示例代码中的
tabController
字段是一个实例变量,因此它将在
MainController
的生命周期内保持在范围内。因此,只要设置了所需的变量,就可以将其传递给
tabController
。(例如,如果它是在事件处理程序中设置的,则可以引用事件处理程序中的
选项卡controller
。)还可以在两个控制器中定义,并在它们之间创建绑定。。。如果您将问题编辑为更具体地说明值何时可用,我可以更新答案。请参阅更新的问题;您只需要从
setConnexion(…)
方法访问嵌套的控制器。我按照您的建议做了,但是当另一个控制器使用conn变量的函数时,我得到了一个NullPointerException。这可能是一个单独的问题。。。我想我会问,在通过
setConnexion(…)
方法设置连接之前,您是否正在引用嵌套控制器中的连接。例如,您将无法在
initialize()
方法中引用它,因为此时不会调用
setConnexion(…)
。任何依赖于连接的初始化都应该在
setConnexion(…)
中完成。
public class MainController {

    @FXML
    private TabController tabController ;

    private Connection conn ;

    // other injected fields, etc...

    public void setConnexion(Connection conn) {
        this.conn = conn ;
        // pass Connection to TabController:
        tabController.setConnexion(conn);
    }
}