重启Swing应用程序

时间:2012-02-22 07:06:26

标签: java swing

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

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

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


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

@mKorbel我通过采用so

中显示的概念编写了以下代码
    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<Process> callable = new Callable<Process>() {

                @Override
                public Process call() throws Exception {
                    Process p = Runtime.getRuntime().exec("cmd /c start java -jar D:\\MovieLibrary.jar");
                    return p;
                }
            };
            FutureTask<Process> futureTask = new FutureTask<Process>(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,应用程序将完全终止,即它不会再次启动。

我非常感谢你的帮助。


它已经解决了。

2 个答案:

答案 0 :(得分:3)

解决方案:

从ActionListener调用以下代码。

ScheduledExecutorService schedulerExecutor = Executors.newScheduledThreadPool(2);
Callable<Process> callable = new Callable<Process>() {

    @Override
    public Process call() throws Exception {
        Process p = Runtime.getRuntime().exec("cmd /c start /b java -jar D:\\MovieLibrary.jar");
        return p;
    }
};
FutureTask<Process> futureTask = new FutureTask<Process>(callable);
schedulerExecutor.submit(futureTask);           

System.exit(0);

感谢。

答案 1 :(得分:0)

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

要解决此类问题,最好使用本机启动器。看一下db visualizer,它有原生的发射器,用于它的java swing程序