Правильное закрытие программы java, когда jdialog является главным окном

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

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

setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

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

frame.dispose();

но процесс по-прежнему, кажется, висит в фоновом режиме

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

как я могу закрыть свое приложение правильно?

6 ответов


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

  System.exit(0);

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


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

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

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


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

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


вы знаете, что 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 передается в качестве аргумента, an IllegalArgumentException будет брошен.


для меня работал только с windowClosing event:

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

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

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 работает самостоятельно, то процесс будет полностью завершен, наслаждайтесь.