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