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


86

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

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

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

回答:


147
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);

25

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

public void windowClosing(WindowEvent e)

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


3
これは、ユーザーがアプリケーションを閉じた場合(たとえば、MacでCmd + Qを押した場合)に機能しますか?このメソッドを実装するクラスは、implements WindowListenerこのコードが機能するために宣言する必要がありますか?もしそうなら、それを答えに含めるのは良いことかもしれません。それ以外の場合、これはエレガントなソリューションです。
intcreator 2015年

@brandaemonこのコード行をmain()メソッドの先頭に追加すると、 "System.setProperty(" apple.eawt.quitStrategy "、" CLOSE_ALL_WINDOWS ");" MacでCmd + Qが押されると、windowListenerが呼び出されます。
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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


9
しかし、これはconfirmExit()OPが望むようにメソッドを実行しません
2012


11
いいえ、単にプログラムを閉じたくありません。それが起こる前に私は何かをしたいです。
alxcyl 2012

すみません、知りませんでした。
ラッセル

1
「私がやりたいのはconfirmExit()、[X]がクリックされたときに...を呼び出すことです。」そして、前のコメントはOQとは無関係です。
DSlomer64 2016


1

これは、JFrame別のを表示するためにボタンを作成したメニューオプションとして配置したものJFrameです。新しいフレームだけが表示され、背後のフレームが破壊されないようにしたかったのです。私は最初に最初のものを隠しましたがJFrame、新しいものが見えるようになりました。新しいものを閉じるとJFrame、私はそれを処分し、続いて古いものを再び見えるようにするアクションをしました。

注:次のコードは、Ravindaの答えのオフ展開してngいますJButton

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);
        }
    });
});

-2

これを試して:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

それが動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.