从 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:id
是 tab
,你会做:
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
对象(并更新任何它需要更新的结果) .
我目前正在为我的研究做一个 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:id
是 tab
,你会做:
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
对象(并更新任何它需要更新的结果) .