我正在查看类似的例子来解决这个问题。我们有一个JavaFX应用程序,它通过以下运行的线程运行一些GUI更新:ScheduledExecutorService :: scheduleAtFixedRate 。
这类似于其他几个问题。我认为最像我的情况的是这两个:
然而,我需要解决的问题是下一步。我的目标是嵌入式应用程序,并且没有机会手动终止JVM任务,或其他简单的答案等。我担心重启会被保留用于严重严重的事情。
我们需要确保所有线程都以有序的方式关闭。我正在寻找的是某种回调或事件,让我注册一个清理例程来关闭我的东西?
我当时认为应该有 '在基类中,JavaFX javafx.application.Application来做行动。
我可能会使用Stop方法,还是可以在FXMLController停止时注册调用?
目前,当我从Netbeans运行我的JavaFX应用程序时,JVM进程仍然存在。这将停止任何进一步的构建脚本并锁定JAR文件。 Netbeans为您提供了终止任务的选项。真正的解决方案意味着应用程序/ JVM有序且整齐地关闭。
( update )...我查看了用于启动JavaFX应用程序的javafx.Application类。我实现了一个Stop()方法。在这里,我确保我称之为平台。退出()......
/////
// @see
// -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29
//
public void stop()
{
Platform.exit();
}
从NetBeans运行时,这并不能解决问题。有时您需要单击stop [X]按钮两次,但是当您使用kill按钮时,该过程会停止。如果您对进度感兴趣,则会将其报告为错误:[Bug 245284],这是一个用于演示问题的小时钟示例。关闭窗口时,NetBeans流程运行面板仍然正在运行'。您无法构建,因为JAR文件已被锁定。至少我们知道手动杀死开发程序。
答案 0 :(得分:2)
我有一个部分解决方案来覆盖陷入这种情况的开发人员。在JavaFX应用程序中声明 stop()方法(Netbeans Maven JavaFX模板称为“ MainApp ”)。当然有问题,但首先是方法。
在程序结束时调用Stop。我打电话给Platform。退出()来关闭JavaFX运行时。我已经添加了一个调用来关闭其他活动的 Executor 线程,我现在保留在列表中,以测试解决方案。
public class MainApp extends Application
{
@Override
public void start(Stage stage) throws Exception
{
.....
}
/**
* Close down the application
* @see
* -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29
**/
@Override
public void stop()
{
Platform.exit();
for( ScheduledExecutorService sched : activeExecutorServices )
{
sched.shutdown();
}
}
}//MainAppl class
因此,通过注释掉关闭和运行我的JavaFX程序的调用,应用程序完成但不会退出,Netbeans显示正在运行的任务。您需要手动点击Netbeans中的kill-button。
取消注释shutdown()调用。当JavaFX应用程序退出时,它也会从Netbeans运行的作业中消失。这似乎是一种解脱。
其余问题:
Hopefyully将帮助下一个面临类似问题的人: - )
答案 1 :(得分:2)
你可以使用setOnCloseRequest
@Override
public void start(Stage primaryStage) {
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
ThreadPool.shutdown();
}
});
initGui(primaryStage);
initData();
}