JavaFX:Main,Controller,FXML之间的参数传递

JavaFX:Main,Controller,FXML之间的参数传递


Controller获取FXML数据
   
   
  1. 【.fxml文件】
  2. <Pane fx:controller = "sample.Controller">
  3. <Button fx:id = "sample"> //设置fx:id属性,在根节点中设置 fx:controller属性
  4. </Pane>
  5. 【Controller类】
  6. @FXML Button sample; //通过@FXML标签获取相应的fx:id节点

Main,Controller之间的数据交换
Main类是通过.fxml文件中转来获取Controller类的数据的;
一般不会在Controller方向获取Main数据,因为Controller的加载是在Main之前的,所以Controller几乎无法获取Main的动态数据,只能获取Main的静态数据;
一般Main和Controller之间的数据交换方法是,通过Main获取Controller的一个实例对象,在Controller中将各种动态数据存放在某个bean中,(或者类私域中,并对外提供set、get方法),以下为了演示方便将数据存在Controller中;
   
### JavaFX 中从 Controller 类调用 stop 方法的实现 在 JavaFX 应用程序中,`stop()` 方法是 `Application` 类的一部分,通常由系统自动调用以执行清理操作。由于 `Controller` 类的主要职责是处理 FXML 定义的 UI 事件和逻辑[^3],它并不直接继承自 `Application` 类,因此无法直接调用 `stop()` 方法。 为了在 `Controller` 类中触发 `stop()` 方法,可以通过以下方式实现: 1. **通过外部通信机制**:将 `Application` 的实例递给 `Controller`,或者通过全局变量或事件总线通知 `Application` 调用 `stop()`。 2. **使用 Platform.exit() 方法**:虽然这不是直接调用 `stop()`,但可以显式退出应用程序并触发 `stop()` 方法的执行。 以下是具体的代码示例: ```java // Application 类 package com.example; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class SampleApp extends Application { private SampleController controller; @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); Parent root = loader.load(); controller = loader.getController(); // 获取 Controller 实例 controller.setApplication(this); // 将 Application 实例递给 Controller primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } public void stopApp() { stop(); // 调用 Application 的 stop 方法 } @Override public void stop() { System.out.println("Application is stopping..."); // 执行清理操作 } public static void main(String[] args) { launch(args); } } // Controller 类 package com.example; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.control.Button; public class SampleController { private SampleApp application; @FXML private Button exitButton; public void setApplication(SampleApp application) { this.application = application; } @FXML private void handleExitButtonClick() { if (application != null) { application.stopApp(); // 触发 Application 的 stop 方法 } else { Platform.exit(); // 如果没有 Application 实例,则直接退出 } } } ``` ### 关键点说明 - 在 `start()` 方法中,通过 `FXMLLoader` 加载 FXML 文件后,可以获取 `Controller` 实例,并将其与 `Application` 实例绑定[^4]。 - `Controller` 类中的 `setApplication()` 方法用于接收 `Application` 实例,从而允许 `Controller` 调用 `Application` 的方法。 - 当用户点击按钮时,`handleExitButtonClick()` 方法会被触发,进而调用 `Application` 的 `stopApp()` 方法,最终执行 `stop()` 方法[^2]。 ### 注意事项 如果未正确递 `Application` 实例,可以使用 `Platform.exit()` 方法显式退出应用程序。这会触发 `stop()` 方法的调用,前提是 `implicitExit` 属性为 `true`。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值