在JavaFx中重新启动应用程序

在JavaFx中重新启动应用程序,java,eclipse,javafx-2,javafx,fxml,Java,Eclipse,Javafx 2,Javafx,Fxml,我想关闭并重新启动我正在制作的已经运行的应用程序(自动),通过单击按钮或类似的方式,我想这样做是为了用另一种语言重新启动应用程序,我对JavaFx和Java基本上是新手,您能给我一个解决这个问题的方法吗?一个解决方案是将开始脚本中的命令行和工作目录传递给main()方法。然后,使用ProcessBuilder可以重新启动应用程序。另一种可能是在自定义类加载器中启动整个应用程序(例如,Spring项目的源代码库中有合适的类加载器),然后基本上可以通过在另一个类加载器中启动main来重新启动,然而,

我想关闭并重新启动我正在制作的已经运行的应用程序(自动),通过单击按钮或类似的方式,我想这样做是为了用另一种语言重新启动应用程序,我对JavaFx和Java基本上是新手,您能给我一个解决这个问题的方法吗?

一个解决方案是将开始脚本中的命令行和工作目录传递给main()方法。然后,使用ProcessBuilder可以重新启动应用程序。另一种可能是在自定义类加载器中启动整个应用程序(例如,Spring项目的源代码库中有合适的类加载器),然后基本上可以通过在另一个类加载器中启动main来重新启动,然而,您需要适当的内务管理来释放第一个实例的线程和资源。

retstart.setOnAction(neweventhandler(){
retstart.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent t) {
            if(getOnCloseRequest()!=null){
                getOnCloseRequest().handle(new WindowEvent(getScene().getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
//write code to invoke application instance again
            }else{
                close();
            }

        }
    });
@凌驾 公共无效句柄(ActionEvent t){ 如果(getOnCloseRequest()!=null){ getOnCloseRequest().handle(新的WindowEvent(getScene().getWindow(),WindowEvent.WINDOW\u关闭请求)); //编写代码以再次调用应用程序实例 }否则{ close(); } } });
这个问题缺乏细节。您确实提到了JavaFX应用程序,但了解该应用程序的部署方式很重要。它是作为java webstart应用程序、独立jar还是独立的本机应用程序在web浏览器中运行?您是如何开始应用程序的?有了这些问题的答案,就更容易回答你的问题

虽然下面的示例不是JavaFX,但这里使用的方法适用于JavaFX应用程序的一些部署方式。重新启动运行良好的应用程序的一种方法是从脚本启动应用程序。脚本内部将是一个while循环,它根据程序退出代码不断重新启动程序。下面是在Linux平台上启动IntelliJ的bash shell脚本示例:

while true ; do
   eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 $MAIN_CLASS_NAME $*
   test $? -ne 88 && break
done
在本例中,启动脚本将“jb.restart.code”作为应用程序参数传递。如果IntelliJ希望重新启动,它将返回值88作为退出代码。脚本观察应用程序退出代码,如果值为88,则重新启动应用程序


这种方法在大多数平台上都很有效,但需要通过脚本启动应用程序。

好吧,实际上我对这种方法很陌生,我有点困惑,没有得到你的答案,你能给我一些代码来帮助我吗,或者参考一篇文章来解释,thxWell实际上类加载器非常复杂,最好尝试命令行方法。您可以从Java启动操作系统进程,因此您只需要知道Java可执行文件的位置以及类路径的设置方式。您可以使用System.getProperty(“java.class.path”)或类似工具来查找类路径。启动时必须传递给应用程序的java.exe的位置。然后,使用Runtime.getRuntime().exec(..)或ProcessBuilder将允许您启动应用程序的完整副本。是的,您的问题是关于它的。但是为什么你需要重新启动应用程序来更改语言?也许不需要重新启动就可以更改它?你的应用程序的语言配置是什么?我对这些机制不太了解,我想要的是重新启动应用程序以重新定义其他语言中的所有对象/控件检查@UlukBiy的问题解决方案。@UlukBiy我想知道如何在不重新启动应用程序的情况下切换语言,如果ResourceBundle是通过FXMLLoader.load()加载的。谢谢@wceo,看看本机自包含应用程序如何?如果它是本机自包含应用程序,那么它是哪个操作系统的本机应用程序?这些细节使答案有所不同。目前,我通过exec和System.exit()实现了Windows解决方案。我认为Linux和MacOS将遵循与相关shell命令相同的路径。您确定您使用的是本机自包含应用程序吗?在我看来,如果您使用脚本启动应用程序,那么您可能正在windows上运行一个独立的jar文件。如果您正在这样做,那么脚本解决方案将适合您。我的理解是,本机自包含应用程序通过exe或msi文件安装在操作系统上。根据本机应用程序在本机平台上的打包、部署和启动方式,您可能仍然能够找到类似的解决方案。JavaFX自包含应用程序可以部署在本机捆绑包中(.exe for Windows,.app for Mac OS X,executable for Linux),其中创建了启动主JAR的本机引导程序。