Java-свинг-программа не закрывается после вызова dispose в последнем окне - PullRequest
1 голос
/ 25 июня 2010

Предисловие: Это первая настоящая свинговая программа, которую я сделал.

У меня есть свинговая программа, где один JButton должен выйти из программы. Эта кнопка вызывает this.dispose () ;. Когда я щелкаю этот JButton, он заставляет полностью закрыть окно, но, глядя на отладчик, сама программа все еще работает.

Мой основной метод состоит только из:

public static void main (String[] args)
{
  java.awt.EventQueue.invokeLater(new Runnable()
  {
    public void run()
    {
      new StartupGui().setVisible(true);
    }
  });
}

Моя кнопка выхода выглядит как кнопка действия выглядит так:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt)
{
  this.dispose();
}

Я также пробовал это для кнопки выхода:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt)
{
  java.awt.EventQueue.invokeLater(new Runnable()
  {
    public void run()
    {
      dispose();
    }
  });
}

Глядя на отладчик после нажатия кнопки выхода, я вижу следующее (и только следующее):

Daemon Thread [AWT-XAWT] (running)
Thread [AWT-Shutdown] (running)
Thread [AWT-EventQueue-0] (running)
Thread [DestroyJavaVM] (running)

Может ли кто-нибудь указать мне правильное направление относительно того, почему программа не закрывается после этого момента? Я немного погуглил, но пока никуда не попал. Если вам нужна дополнительная информация, просто дайте мне знать

Спасибо:)

Ответы [ 2 ]

4 голосов
/ 25 июня 2010

Поскольку метод dispose () освобождает только ресурсы.

Документ имеет

Примечание: Когда выбрано последнее отображаемое окно в виртуальной машине Java (VM), VM может прекратить.См. AWT Threading Issues для получения дополнительной информации.

Вы заметили, что может ?

Ссылка выше дает вам подробную информацию о функции Auto shutdown .Вы можете прочитать больше об этом, или вы можете просто решить эту проблему, заменив this.dispose() на System.exit(0)

0 голосов
/ 25 июня 2010

Эта статья о Pushing Pixels: Завершение работы AWT и потоки демона обсуждает поведение выключения AWT, которое было изменено в версии 1.4.Тем не менее, в статье отмечается, что может быть сложно получить чистое завершение работы.

Не видя остальной код, я могу предложить только указатели:

  • , чтобы убедиться, что нет другихскрытые кадры, которые не были удалены
  • , гарантируют, что в очереди AWT не генерируются никакие сообщения (т. е. устанавливаются точки останова в EventQueue.)
  • в противном случае посмотрите на кадр стека для этих потоков и посмотритечем они заняты
...