从FXML获取变量到导入的FXML

时间:2015-05-10 14:16:25

标签: javafx fxml

我目前正在为我的学习做一个Java(+使用MySQL)应用程序:一个Hopital数据库

我使用JavaFX对我的界面进行编码。 我有一个主FXML(对于一般视图)我有标签,在每个标签中我使用(fx:include)导入另一个FXML。因此,我的应用程序的每个模块都有自己的Controller和自己设计的View。

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

谢谢! 编辑:让我告诉你我的代码

所以首先它是我加载我的fxml的类(我首先在Connexion的窗口上,如果连接所需的信息都可以,我用主界面加载fxml Main)并设置连接(THE我可以从我的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方法得到变量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();


    }
 }     


}

1 个答案:

答案 0 :(得分:1)

你只需要一个对应于所包含的fxml的控制器的引用,该控制器对应于" main" FXML。您可以使用Nested Controllers机制执行此操作。

简而言之,如果你有一个&#34;主要&#34;带有<fx:include>标记的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:id中使用的fx:include。例如,如果tab.fxml的控制器类为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);
    }
}

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