Почему простое приложение Swing не закрывается, когда отображается окно? - PullRequest
5 голосов
/ 21 марта 2011

Вот пример кода:

import javax.swing.*;

public class MyApplicatin {
    public static void main(String args[]) {
        JFrame window = new JFrame();
        window.setSize(100,100);
        window.setVisible(true);

        System.out.println("Should terminate after printing this.");
    }
}

Почему это маленькое приложение не завершает работу после печати последней строки?

Я предполагаю, что Swing запускает новый поток, не являющийся демоном. Я читаю о том, что все время приходится выполнять графические элементы в Java в отдельном потоке, если Swing уже использует отдельный поток, зачем кому-то писать об этом?

Ответы [ 2 ]

8 голосов
/ 21 марта 2011

С чего бы это?Обычно, когда вы показываете окно, вы захотите контролировать выход из JVM.И ничто в спецификации JVM не говорит, что JVM должна завершиться, когда метод main() достигнет конца.

Oracle имеет некоторую документацию по этой конкретной проблеме :

Причина в том, что AWT инкапсулирует механизм асинхронной отправки событий для обработки событий, которые могут запускать компоненты AWT или Swing.Точное поведение этого механизма зависит от реализации.В частности, он может запускать вспомогательные потоки, не являющиеся демонами, для своих внутренних целей.Фактически, это потоки, которые препятствуют выходу из вышеприведенного примера.

Одно (из трех) ограничений этого механизма таково:

Существует по крайней мере одинживой поток, не являющийся демоном, когда в приложении имеется хотя бы один отображаемый компонент AWT или Swing (см. Component.isDisplayable).

Это означает, что JVM не будет завершать работусвой собственный, пока есть отображаемый компонент AWT / Swing.

Предупреждение: удаление всех отображаемых компонентов не обязательно означает, что поток, не являющийся демоном, пропал:

Это зависит от реализации, если и когда потоки, не являющиеся вспомогательными, завершаются после того, как все компоненты становятся неотображаемыми.

3 голосов
/ 21 марта 2011

Вам нужно будет добавить

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.dispatchEvent(new WindowEvent(window, Event.WINDOW_DESTROY));

Как сказал Иоахим, утилизация окна тоже может помочь, но это зависит от реализации. В любом случае вы должны закрыть окно, иначе приложение продолжит работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...