【问题标题】:exit a console application while a Swing JFrame still exists在 Swing JFrame 仍然存在时退出控制台应用程序
【发布时间】:2018-04-25 03:40:05
【问题描述】:

我想在javax.swing.JFrame 仍然存在时退出控制台应用程序。

我有一个显示javax.swing.JFrame 的控制台程序。有时我想将标准输出重定向到文件。

java -cp path com.domain.package > output.log

一个合理的 JFrame 配置值是WindowConstants.DISPOSE_ON_CLOSE,据我了解,当单击关闭 JFrame 时,它​​会被丢弃,但控制台程序会在 main 的右大括号处阻塞。我不知道它在等什么。那时我必须Control-C 来终止main。

另一个合理的 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,从而关闭所有文件。

【问题讨论】:

  • 尝试使用javaw(在Windows上)
  • 很抱歉,仅出于此目的切换到 Windows 是不现实的。
  • 好吧,您“可以”将stdout 重定向到应用程序内部的文件,或者您可以探索“分离”该过程,可能类似于java -cp path com.domain.package > output.log &

标签: java swing jframe console-application


【解决方案1】:

EXIT_ON_CLOSEDISPOSE_ON_CLOSE 据我所知,仅管理与 JFrame 相关的应用程序行为,即 I.E。如果它设置为 exit_on_close,当 JFrame 关闭时,您会得到一个System.exit(0)

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

【讨论】:

  • System.exit 确实终止了应用程序,但目标是在不破坏 JFrame 的情况下退出。退出的目的是 cat 日志文件,而无需打开第二个控制台来 cat 文件。小好处,是的。
  • 啊,对不起。我想我误解了这个问题。最后一句话是关键。我不完全确定您要实现什么目标-因此,当您的主应用程序终止时,您希望 JFrame 仍然存在,以便释放 output.log 文件以执行...什么?也许创建自己的输出文件(即File output = new File("...");)并在应用程序中处理文件访问是一种可能的方法?您可以将任何内容写入文件并根据需要在代码中关闭它的句柄。
  • 是的,这是一个很好的解决方案,但是这整个问题对我来说不再重要。我决定截屏并将 JFrame 图像保存到磁盘,无需保持 JFrame 打开,然后继续关闭 JFrame 并让应用程序终止,从而释放所有文件。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多