我想在javax.swing.JFrame
仍然存在的情况下退出控制台应用程序。
我有一个显示javax.swing.JFrame
的控制台程序。有时我想将标准输出重定向到文件。
java -cp path com.domain.package > output.log
一个合理的JFrame配置值是WindowConstants.DISPOSE_ON_CLOSE
,我理解JFrame在单击关闭时会被丢弃,但控制台程序会在main的右括号处阻塞。我不知道它在等什么。此时我必须Control-C
终止主。
另一个合理的JFrame配置值是WindowConstants.EXIT_ON_CLOSE
,我理解当单击JFrame关闭时,JFrame不仅会关闭,而且还会导致main终止。请注意,即使main已到达右括号,它也不会退出,直到关闭JFrame的单击。此行为优于前一种情况,因为不需要Control-C
来终止main。
我希望控制台程序终止,以便即使JFrame仍然存在,也会释放output.log
文件。我尝试通过让一个线程中的Runnable拥有JFrame来做到这一点。那没用;在JFrame关闭之前,控制台程序不会终止。
// main program...
static void main(String[] args)
{
PlotWorker worker = new PlotWorker(data);
Thread thread = new Thread(worker);
thread.start();
// do not use thread.join
// simply exit at the closing brace of main
}
// owner of the JFrame...
class PlotWorker implements Runnable
{
JFrame jFrame;
@Override
public void run()
{
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
实际上我知道我可以使用文本编辑器查看output.log
文件(或者只是Linux cat
来自第二个控制台的文件),即使第一个控制台中的标准输出仍然具有“处理“output.log
。我希望在JFrame仍然存在时退出一个干净的解决方案。
答案 0 :(得分:0)
EXIT_ON_CLOSE
和DISPOSE_ON_CLOSE
仅管理有关JFrame,I.E所发生情况的应用程序行为。如果设置为exit_on_close,则在JFrame关闭时会得到System.exit(0)
。
一般情况下,我认为System.exit(status)
是您在终止应用程序时所需要的,它应该处理由它创建的任何对象,释放文件锁并关闭所有窗口。如果您使用流写入日志文件,可能会有点乱,因为它也会被终止,可能没有调用它的.close()
函数。