web-dev-qa-db-ja.com

JFrameの閉じるボタンのクリックイベントをキャプチャする方法

JFrameのタイトルバーの赤い閉じるボタンがクリックされたときにメソッドconfirmExit()を呼び出したい。

そのイベントをキャプチャするにはどうすればよいですか?

また、ユーザーが続行しないことを選択した場合、ウィンドウが閉じないようにします。

81
alxcyl
import javax.swing.JOptionPane;
import javax.swing.JFrame;

/*Some piece of code*/
frame.addWindowListener(new Java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(Java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});

ユーザーが「はい」を選択しない限り、ウィンドウが閉じないようにしたい場合は、以下を追加できます。

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
130

WindowClosingメソッドをオーバーライドします。

public void windowClosing(WindowEvent e)

ウィンドウが閉じられているときに呼び出されます。この時点でクローズ操作をオーバーライドできます。

25
Shashank Kadne
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

動作します。最初にframeというJFrameを作成し、次にこのコードを下に追加します。

4
Russell

これは、別のJFrameを表示するためにJFrameにボタンを作成したメニューオプションとして配置したものです。新しいフレームのみを表示し、その背後のフレームを破壊しないようにしました。最初は最初のJFrameを非表示にしましたが、新しいものは表示されました。新しいJFrameを閉じると、それを破棄し、古いものを再び表示するアクションを実行しました。

注:次のコードはRavindaの回答から展開され、ngJButtonです。

ng.addActionListener((ActionEvent e) -> {
    setVisible(false);
    JFrame j = new JFrame("NAME");
    j.setVisible(true);
    j.addWindowListener(new Java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(Java.awt.event.WindowEvent windowEvent) {
            setVisible(true);
        }
    });
});
1
Cody

これはうまくいくかもしれません:

jdialog.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
        System.out.println("jdialog window closed event received");
    }

    public void windowClosing(WindowEvent e) {
        System.out.println("jdialog window closing event received");
    }
});

ソース: https://alvinalexander.com/Java/jdialog-close-closing-event

1
Phidippus