我愿意在我的应用程序中添加一个按钮,单击该按钮将重新启动应用程序。我搜索了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,应用程序将完全终止,即它不会再次启动。
我非常感谢你的帮助。
它已经解决了。
答案 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程序