我想在我的应用程序中实现reset
功能,它清理一些目录,复制文件等,然后为了完成我需要重启它的过程。
如何让应用程序重新运行?我认为打开第二个实例并关闭这个实例就足够了,尽管它不是真正的重启。
我的应用程序的核心是类扩展JFrame
但是有很多静态块在程序执行时读取类的扩展。我需要以编程方式重新启动我的应用程序,以便再次创建/执行所有静态集合和块。
它就是这样开始的。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Window().createGUI();
}
});
这看起来很好用:
public void restart() {
/* dispose();
Window.main(null);*/
StringBuilder cmd = new StringBuilder();
cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
cmd.append(jvmArg + " ");
}
cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
cmd.append(Window.class.getName()).append(" ");
try {
Runtime.getRuntime().exec(cmd.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);
}
答案 0 :(得分:4)
这是来自另一个主题,但与其他主题中接受的问题相反,这个问题确实有效。
public void restart() {
StringBuilder cmd = new StringBuilder();
cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
cmd.append(jvmArg + " ");
}
cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
cmd.append(Window.class.getName()).append(" ");
try {
Runtime.getRuntime().exec(cmd.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);
}
27/02/2018:我相信Mark发布了更好的解决方案:https://stackoverflow.com/a/48992863/1123020
答案 1 :(得分:2)
您的问题/我的意见:
我想在我的应用程序中实现重置功能,它清理一些目录,复制文件等,然后为了完成我需要重启它的过程。如何使应用程序重新运行?
这是许多应用程序的常见功能/需求,而不仅仅是学术任务。不幸的是,没有一个适合所有解决方案,这将取决于您的程序的具体细节。如果您的程序非常模块化并且使用智能M-V-C分离关注点,那么执行此操作变得更加容易,通常只需将模型重置为初始状态,或者将新模型加载到GUI中。
我认为打开第二个实例并关闭这个实例就足够了,尽管它不是真正的重启。
我认为这是一个非常糟糕的主意。最好简单地将文本组件,按钮,复选框等的状态重置为其原始状态。同样,代码越模块化,就越容易做到。每个单独的模块都可以有自己的reset()
方法,负责初始化它。
在我的情况下,我想重新加载由许多JPanel组成的JFrame。我做到了:
我再次强烈建议你不要走这条路。
您可以将一些JTextComponents放入ArrayList中以便于重置。例如,您可以在重置内重置GUI字段。类似的东西:
public void reset() {
// assuming you have an ArrayList of JTextComponents called textComponents
for (JTextComponent textComponent : textComponents) {
textComponent.setText("");
}
// same if you had a bunch of comboboxes in a List called comboBoxes
for (JComboBox comboBox : comboBoxes) {
comboBox.setSelection(-1); // consider removing listeners first, then re-adding them
// etc for other components
}
}
修改
我发现了我的解决方案 - >处理JFrame并不是那么好。我有很多静态块,加载序列化文件等我需要真正重新启动它。也许应用程序执行本身很简单。
很抱歉,但这只是告诉我你的程序可能会改进其组织。它应该是可重置的,如果没有,请考虑更改它以便它可以这样。它是否遵循模型 - 视图 - 控制结构?如果没有,请考虑这样做。