Правильное закрытие Java-программы, когда JDialog - главное окно - PullRequest
6 голосов
/ 25 августа 2011

У меня в приложении главное окно JDialog (изначально это был JFrame, но он отображался на панели задач, который мне не нужен).

В настоящее время я делаю:

setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

и когда я нажимаю кнопку выхода:

frame.dispose();

Но кажется, что процесс все еще находится в фоновом режиме

У JFrame был JFrame.EXIT_ON_CLOSE, который, казалось, делал то, что я хотел.

Как правильно закрыть приложение?

Ответы [ 6 ]

11 голосов
/ 25 августа 2011

Вам необходимо добавить WindowListener, который будет выполнять System.exit (0) при закрытии диалога.

JDialog dialog = ...;
dialog.addWindowListener(new WindowAdapter() { 
    @Override public void windowClosed(WindowEvent e) { 
      System.exit(0);
    }
  });

Конечно, System.exit (0) после нажатия кнопки «Выход» (что было предложено в другом месте в этой теме) по-прежнему требуется.

6 голосов
/ 25 августа 2011

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

  System.exit(0);

там, где вы хотите, чтобы программа заканчивалась, возможно, сразу после строки dispose ().

3 голосов
/ 25 августа 2011

рассмотрите возможность использования JWindow (не decoretad от defalut), но это немного усложняет тот факт, что JWindow требовали инициализации из JFrame (просто должен существовать, больше ничего) в качестве родителя

лучшебудет добавлено WindowListener и все события / действия будут перенаправлены / управляются таким образом

1 голос
/ 25 августа 2011

Вы знаете, что поле EXIT_ON_CLOSE также наследуется JDialog, верно?

Как уже упоминалось @ camickr , EXIT_ON_CLOSE не является допустимым значением для метода setDefaultCloseOperation класса JDialog.Как указано в API,

Устанавливает операцию, которая будет выполняться по умолчанию, когда пользователь инициирует «закрытие» в этом диалоговом окне.Вы должны указать один из следующих вариантов:

  • DO_NOTHING_ON_CLOSE (определено в WindowConstants): ничего не делать;требуется, чтобы программа обрабатывала операцию в методе windowClosing зарегистрированного объекта WindowListener.
  • HIDE_ON_CLOSE (определено в WindowConstants): автоматически скрывать диалоговое окно после вызова любых зарегистрированных WindowListener объектов.
  • DISPOSE_ON_CLOSE (определено в WindowConstants): автоматически скрывать и удалять диалоговое окно после вызова любых зарегистрированных WindowListener объектов.

Если EXIT_ON_CLOSE передается в качестве аргумента,IllegalArgumentException будет брошено.

0 голосов
/ 12 декабря 2017

Вы можете попробовать это ниже удивительного исходного кода -

JDialog dialog = (JDialog) container;
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setModal(false);
dialog.setVisible(false);
dialog.dispose();

Runtime.getRuntime().exit(1);

это выше сказанное отключит процесс, а также после удаления контейнера JDialog, также есть еще одно преимущество, если этот JDialog работает над любым другим JFrame или JDialog, поэтому родительский объект не завершится, но если этот JDialog выполняется самостоятельно, тогда процесс будет полностью завершен, наслаждайтесь.

0 голосов
/ 07 сентября 2017

У меня работал только с событием windowClosing:

dialog.addWindowListener(new WindowAdapter() 
                @Override
                public void windowClosing(WindowEvent e) {
                     System.exit(0);
                }
    });
...