退出控制台应用程序,而Swing JFrame仍然存在

时间:2018-04-25 03:40:05

标签: java swing jframe console-application

我想在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仍然存在时退出一个干净的解决方案。

编辑:这个问题对我来说不再重要。我决定屏幕捕获并将JFrame图像保存到磁盘,从而避免了保持JFrame打开的需要,然后继续关闭JFrame,从而关闭所有文件。

1 个答案:

答案 0 :(得分:0)

据我所知,

EXIT_ON_CLOSEDISPOSE_ON_CLOSE仅管理有关JFrame,I.E所发生情况的应用程序行为。如果设置为exit_on_close,则在JFrame关闭时会得到System.exit(0)

一般情况下,我认为System.exit(status)是您在终止应用程序时所需要的,它应该处理由它创建的任何对象,释放文件锁并关闭所有窗口。如果您使用流写入日志文件,可能会有点乱,因为它也会被终止,可能没有调用它的.close()函数。