Подтвердить что ты не робот

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

Я только что написал этот тестовый код в своем классе 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() - это точка входа в программу, но это заставляет меня задаться вопросом: что, если другой класс под названием CustomUIPanel.main() для тестирования? Тогда мой вызов System.exit(0) неверен.

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

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

4b9b3361

Ответ 1

Вы можете использовать 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();
            }
        });
    }
}

Ответ 2

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

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

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

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

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

Ответ 3

Ну,

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

Ответ 4

Диалог

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

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

Ответ 5

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

Ответ 6

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

this.dispose();

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