从 FXML 获取变量到导入的 FXML

Getting a variable from a FXML to an imported FXML

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

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

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

谢谢! 编辑:让我向您展示我的代码

所以首先是 class,我在其中加载我的 fxml(我首先在 Connexion 的 window 上,如果连接所需的信息正常,我加载 fxml Main 与主界面)然后我将从我的 fxml Connexion 获得的连接(我需要发送的变量)设置为 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 方法获得变量连接,然后我可以将它发送到另一个控制器

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 对应的控制器。您可以使用 Nested Controllers 机制来做到这一点。

简而言之,如果您有一个带有 <fx:include> 标签的 "main" fxml,请将 fx:id 添加到 <fx:include>:

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>

然后在 MainController 中,您可以使用 @FXML 从包含的 fxml 注入控制器。规则是将单词 "Controller" 附加到 fx:include 中使用的 fx:id。例如,如果 tab.fxml 的控制器 class 是 TabController,假设 fx:idtab,你会做:

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);
    }
}

现在只需在 TabController 中定义一个 setConnexion(...) 方法(如果您还没有)来接收 Connection 对象(并更新任何它需要更新的结果) .