我目前正在为我的学习做一个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();
}
}
}
答案 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: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);
}
}
现在只需在setConnexion(...)
中定义一个TabController
方法(如果您还没有)接收Connection
对象(并更新因此需要更新的任何内容)