закрыть консольное приложение, пока существует Swing JFrame - PullRequest
0 голосов
/ 25 апреля 2018

Я хотел бы выйти из консольного приложения, пока 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.

Я хочу завершить консольную программу, чтобы файл output.log был выпущен, даже если JFrame еще жив. Я пытался сделать это, имея JFrame, принадлежащий Runnable в потоке. Это не сработало; консольная программа не завершается, пока не будет закрыт 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 голосов
/ 25 апреля 2018

EXIT_ON_CLOSE и DISPOSE_ON_CLOSE, насколько мне известно, определяют поведение приложения только в отношении того, что происходит с JFrame, I.E. если установлено значение exit_on_close, вы получите System.exit(0), когда JFrame закрыт.

В общем, я думаю, System.exit(status) - это то, что вам нужно при завершении приложения, оно должно удалять любой созданный им объект, снимать блокировки файлов и закрывать все окна. Может быть немного грязно, если вы используете поток для записи в ваш лог-файл, потому что он тоже будет прерван, возможно, без вызова функции .close().

...