重启Swing应用程序

我愿意在我的应用程序中添加一个按钮,单击该按钮将重新启动应用程序。 我搜索过谷歌,但除了这个之外没有任何帮助。 但是这里遵循的程序违反了WORA的Java概念。

是否还有其他以Java为中心的方法来实现此function? 是否可以只分叉另一个副本然后退出?

提前致谢。 我感谢您的帮助。


@deporter我已经尝试过你的解决方案,但它无法正常工作:(

@mKorbel我通过采用你所展示的概念编写了以下代码

JMenuItem jMenuItem = new JMenuItem("JYM"); jMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true); executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true); ScheduledFuture future = executor.schedule(new Runnable() { @Override public void run() { try { Process p = Runtime.getRuntime().exec("cmd /c start java -jar D:\\MovieLibrary.jar"); } catch (IOException ex) { ex.printStackTrace(); } } }, 2, TimeUnit.SECONDS); executor.shutdown(); try { executor.awaitTermination(10, TimeUnit.SECONDS); } catch (InterruptedException e1) { e1.printStackTrace(); } System.exit(0); } }); 

并且:

 ScheduledExecutorService schedulerExecutor = Executors.newScheduledThreadPool(2); Callable callable = new Callable() { @Override public Process call() throws Exception { Process p = Runtime.getRuntime().exec("cmd /c start java -jar D:\\MovieLibrary.jar"); return p; } }; FutureTask futureTask = new FutureTask(callable); schedulerExecutor.submit(futureTask); schedulerExecutor.shutdown(); try { schedulerExecutor.awaitTermination(10, TimeUnit.SECONDS); } catch (InterruptedException e1) { e1.printStackTrace(); } System.exit(0); 

它的工作但只有一次。 如果我第一次启动应用程序并按下JYM menuitem然后它会关闭,几秒后它会打开一个带有cmd的新UI,但是如果按下那个JYM menuitem,应用程序将完全终止,即它不会再次启动。

我非常感谢你的帮助。


它解决了。

解决方案:

从ActionListener调用以下代码。

 ScheduledExecutorService schedulerExecutor = Executors.newScheduledThreadPool(2); Callable callable = new Callable() { @Override public Process call() throws Exception { Process p = Runtime.getRuntime().exec("cmd /c start /b java -jar D:\\MovieLibrary.jar"); return p; } }; FutureTask futureTask = new FutureTask(callable); schedulerExecutor.submit(futureTask); System.exit(0); 

谢谢。

您在答案中提供的链接是重新启动swing应用的最佳方式。 让我问你,是不是通过“WORA”做了一件坏事? 大多数应用程序都带有平台中心启动器。 它使您的应用程序看起来像一个本机应用程序。 您是否打算将整个应用程序部署为双击jar文件? 双击jar文件不是很直观。 有时,如果本地计算机安装winip或winrar,例如,如果您双击一个jar文件,它默认情况下不会启动您的应用程序。

要解决这些问题,最好有一个本机发射器。 看一下db visualizer,它有原生的发射器,用于它的java swing程序