【问题标题】:Getting a variable from a FXML to an imported FXML将变量从 FXML 获取到导入的 FXML
【发布时间】:2015-05-10 14:16:25
【问题描述】:

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

我使用 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 方法获得变量连接,然后我可以将它发送到另一个控制器

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


    }
 }     


}

【问题讨论】:

    标签: javafx fxml


    【解决方案1】:

    您只需要在与“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 的控制器类是 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 对象(并因此更新它需要更新的任何内容)。

    【讨论】:

    • 是的,非常感谢!但是,如果我在调用初始化方法之前没有要设置的变量,它仍然是可能的,或者没有其他方法?
    • 示例代码中的tabController 字段是一个实例变量,因此它将在MainController 的生命周期内保持在范围内。因此,只要设置了您需要的变量,您就可以将其传递给tabController。 (例如,如果它在事件处理程序中设置,您可以在事件处理程序中引用tabController。)您还可以在两个控制器中定义JavaFX properties,并在它们之间创建绑定......如果您编辑您的问题要更具体地说明这些值何时可用,我可以更新答案。
    • 查看更新的问题;您只需要通过setConnexion(...) 方法访问嵌套控制器。
    • 我按照你的建议做了,但是当另一个控制器使用使用 conn 变量的函数时,我得到了 NullPointerException。
    • 这可能是一个单独的问题......我想我会问你是否在嵌套控制器中引用连接,然后再通过setConnexion(...) 方法设置它。例如。您将无法在 initialize() 方法中引用它,因为此时不会调用 setConnexion(...)。任何依赖于连接的初始化都应该在setConnexion(...)中完成。
    猜你喜欢
    • 2014-02-25
    • 2018-12-20
    • 1970-01-01
    • 2017-02-04
    • 2018-12-24
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多