Java 重新启动Swing应用程序

Java 重新启动Swing应用程序,java,swing,Java,Swing,我愿意在我的应用程序中添加一个按钮,单击该按钮将重新启动应用程序。我在谷歌上搜索了一下,但没有找到任何有用的东西。但是下面的过程违反了Java的WORA概念 是否有其他以Java为中心的方法来实现此功能?有没有可能再复制一份然后退出 提前谢谢。我感谢你的帮助 @驱逐者我尝试过你的解决方案,但不起作用:( @mKorbel我根据您在中展示的概念编写了以下代码 JMenuItem JMenuItem=新的JMenuItem(“JYM”); addActionListener(新的ActionLis

我愿意在我的应用程序中添加一个按钮,单击该按钮将重新启动应用程序。我在谷歌上搜索了一下,但没有找到任何有用的东西。但是下面的过程违反了Java的WORA概念

是否有其他以Java为中心的方法来实现此功能?有没有可能再复制一份然后退出

提前谢谢。我感谢你的帮助


@驱逐者我尝试过你的解决方案,但不起作用:(

@mKorbel我根据您在中展示的概念编写了以下代码

JMenuItem JMenuItem=新的JMenuItem(“JYM”);
addActionListener(新的ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
ScheduledThreadPoolExecutor executor=新的ScheduledThreadPoolExecutor(10);
executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
executor.SetExecuteExistingDelayedTaskAfterShutdownPolicy(true);
ScheduledFuture future=executor.schedule(new Runnable()){
@凌驾
公开募捐{
试一试{
进程p=Runtime.getRuntime().exec(“cmd/c start java-jar D:\\MovieLibrary.jar”);
}捕获(IOEX异常){
例如printStackTrace();
}
}
},2,时间单位(秒);
executor.shutdown();
试一试{
执行器等待终止(10,时间单位秒);
}捕捉(中断异常e1){
e1.printStackTrace();
}
系统出口(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);
ScheduledExecutorService schedulerExecutor=Executors.newScheduledThreadPool(2);
Callable Callable=new Callable(){
@凌驾
公共进程调用()引发异常{
进程p=Runtime.getRuntime().exec(“cmd/c start java-jar D:\\MovieLibrary.jar”);
返回p;
}
};
FutureTask FutureTask=新的FutureTask(可调用);
ScheduleExecutor.submit(未来任务);
schedulerExecutor.shutdown();
试一试{
调度执行器等待终止(10,时间单位秒);
}捕捉(中断异常e1){
e1.printStackTrace();
}
系统出口(0);
它可以工作,但只有一次。如果我第一次启动应用程序并按JYM menuitem,它就会关闭,几秒钟后它会用cmd打开一个新的ui,但如果我按JYM menuitem,应用程序将完全终止,即不再启动

我真的很感谢你的帮助



问题解决了。

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

要解决这些问题,最好有一个本机启动器。看看db visualizer,它的java swing程序有本机启动器

解决方案:

从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);
ScheduledExecutorService schedulerExecutor=Executors.newScheduledThreadPool(2);
Callable Callable=new Callable(){
@凌驾
公共进程调用()引发异常{
进程p=Runtime.getRuntime().exec(“cmd/c start/b java-jar D:\\MovieLibrary.jar”);
返回p;
}
};
FutureTask FutureTask=新的FutureTask(可调用);
ScheduleExecutor.submit(未来任务);
系统出口(0);

谢谢。

我只是好奇,java的概念是什么?这可能会有所帮助:@HarryJoy-这是可能的,包括SingleInstance、App-->SplashScreen-->App@HarryJoyWODE的妹妹-编写一次调试无处不在:)
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);