JFrame и почему продолжать работать - PullRequest
2 голосов
/ 15 августа 2010

Почему, если я создаю JFrame, программа продолжает работать до тех пор, пока (т.е.) я не закрою ее с помощью маленькой "кнопки выхода" в окне?

Я искал этот ответ и потерпел неудачу. Единственное, что я догадался, это то, что когда я делаю new JFrame(), это похоже на специальный new, который сохраняет ссылку на объект в EDT, поэтому на него всегда будут ссылаться (даже если это был анонимный «новый»), и это не будет удален сборщиком мусора. Затем, как только происходит событие закрытия окон, объект разыменовывается и уничтожается.

1 Ответ

7 голосов
/ 15 августа 2010

Попробуйте, yourFrame.setCloseOperation(JFrame.EXIT_ON_CLOSE).

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

Когда запускается виртуальная машина Java, обычно существует один поток, не являющийся демоном (который обычно вызывает метод с именем main некоторого назначенного класса). Виртуальная машина Java продолжает выполнять потоки, пока не произойдет одно из следующих событий:

  • Вызван метод выхода класса Runtime, и менеджер безопасности разрешил выполнение операции выхода.
  • Все потоки, которые не являются потоками демонов, умерли, либо возвращаясь из вызова метода run, либо выбрасывая исключение, которое распространяется за пределы метода run.

Это не создание JFrame, которое запускает "gui-thread". Этот поток запускается, когда кадр становится видимым, и, возможно, ему нужно отправлять события.

...