我有一个javaFx项目,我想在Controller内部实现一个方法,每次阶段(窗口)关闭时调用它,以便能够在关闭它之前执行某些操作.
将方法放置在控制器内的愿望是因为要采取的动作取决于用户在使用场景时做出的选择.
我的目标是每次用户关闭舞台,进行打印,然后进行与用户相关的操作.
我在控制器类中尝试:
@FXML
public void exitApplication(ActionEvent event) {
System.out.println("stop");
action();
Platform.exit();
}
但它没有效果.
解决方法:
仅从设计角度来看,在控制器中将处理程序与阶段关联起来并不合理,因为阶段通常不是控制器所连接的视图的一部分.
更自然的方法是在控制器中定义一个方法,然后从处理程序调用该方法,该处理程序与创建阶段的阶段关联.
所以你会在控制器中做这样的事情:
public class Controller {
// fields and event handler methods...
public void shutdown() {
// cleanup code here...
System.out.println("Stop");
action();
// note that typically (i.e. if Platform.isImplicitExit() is true, which is the default)
// closing the last open window will invoke Platform.exit() anyway
Platform.exit();
}
}
然后在你加载FXML的那一刻你会做
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/file.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setOnHidden(e -> controller.shutdown());
stage.show();
同样,退出应用程序可能不是(或可能不应该)控制器的责任(它是创建窗口或管理应用程序生命周期的类的责任),所以如果你真的需要强制退出时窗口关闭,您可能会将其移动到onHidden处理程序:
public class Controller {
// fields and event handler methods...
public void shutdown() {
// cleanup code here...
System.out.println("Stop");
action();
}
}
和
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/file.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setOnHidden(e -> {
controller.shutdown();
Platform.exit();
});
stage.show();
标签:java,javafx-8 来源: https://codeday.me/bug/20190724/1522950.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。