Какое правильное действие при закрытии окон в java / swing?

Я просто написал этот тестовый код в своем classе CustomUIPanel:

public static void main(String[] args) { final JDialog dialog = CustomUIPanel.createDialog(null, CustomUIPanel.selectFile()); dialog.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } 

Он работает правильно, если CustomUIPanel.main() является точкой входа в программу, но это заставляет меня задаться вопросом: что, если другой class под названием CustomUIPanel.main() для тестирования? Тогда мой вызов System.exit(0) неверен.

Есть ли способ сообщить streamу отправки событий Swing выйти автоматически, если нет окон верхнего уровня?

Если нет, то, что нужно сделать JDialog / JFrame для закрытия, если целью является выход программы, когда все windows верхнего уровня закрыты?

Вы можете использовать метод setDefaultCloseOperation() JDialog , указав DISPOSE_ON_CLOSE :

 setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

См. Также 12.8 Выход программы .

Добавление. Включая полезный ответ @ camickr, этот пример завершается, когда закрыто окно или нажата кнопка закрытия.

 import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; /** @see http://stackoverflow.com/questions/5540354 */ public class DialogClose extends JDialog { public DialogClose() { this.setLayout(new GridLayout(0, 1)); this.add(new JLabel("Dialog close test.", JLabel.CENTER)); this.add(new JButton(new AbstractAction("Close") { @Override public void actionPerformed(ActionEvent e) { DialogClose.this.setVisible(false); DialogClose.this.dispatchEvent(new WindowEvent( DialogClose.this, WindowEvent.WINDOW_CLOSING)); } })); } private void display() { this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new DialogClose().display(); } }); } } 

Не уверен в использовании JDialog.

Но при использовании JFrame вы должны использовать frame.dispose (). Если кадр является последним открытым кадром, то виртуальная машина будет завершена.

Обратите внимание, что в диалоговом окне отсутствует опция EXIT_ON_CLOSE, так как он обычно не должен выходить из виртуальной машины.

При закрытии диалога вы всегда можете получить родительский кадр диалога. Затем вы можете отправить событие в кадр, чтобы сообщить ему закрыть его. Что-то вроде:

 WindowEvent windowClosing = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING); //Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing); frame.dispatchEvent(windowClosing); 

Что ж,

Вместо этого вы можете использовать JFrame. Предполагается, что JDialog используется как всплывающее окно приложения, которое работает в JFrame, чтобы привлечь внимание пользователей и приостановить основное приложение. Если JFrame закрыт, вы можете вызвать System.exit (0)

диалог имеет метод getParent() , который, как я полагаю, установлен в null в вашем случае здесь CustomUIPanel.createDialog(null,

вы можете использовать это для выхода из условия.

Вот что я бы рекомендовал: dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

использование

 this.dispose(); 

Он должен работать.

  • Java KeyListener заикается
  • Java Динамически Загрузка classа
  • Как обновить поле метки каждые 2 секунды в java fx?
  • Расширяет JFrame и создает его внутри программы
  • Как установить размер изображения с помощью RescaleOp
  • Как имитировать буферизованное периферийное устройство с SwingWorker?
  • Значок настройки и значения JComboBox
  • Программа не получает доступ к методу paintComponent () расширенного classа JPanel
  • Как сделать canvas с Swing?
  • Имея изображения в качестве фона JPanel
  • Как добавить MouseListener в элемент на Java Swing Canvas
  • Давайте будем гением компьютера.