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