3

次のような JFrame を設定しました。

public class XFrame extends JFrame {

public XFrame() {
    setSize(100, 100);
}
@Override
public void dispose() {
    super.dispose();
    System.out.println("Dispose get called");
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        public void run() {
            XFrame f = new XFrame();
            f.setTitle("Hello World");
            //f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });
}
}

私が期待しているのは、閉じるボタン [X] を押すと、dispose メソッドが呼び出されることです。ただし、DefaultCloseOperation(???)にDISPOSE_ON_CLOSEが設定されている場合のみの状況です。Java はここで私を本当に驚かせます。DefaultCloseOperation 値 (DISPOSE_ON_CLOSE と EXIT_ON_CLOSE) の両方の場合に呼び出されるメソッドを実装する方法は?

4

4 に答える 4

5

EXIT_ON_CLOSEJVM が終了すると、とにかくすべてのリソースが「破棄」されるため、破棄する必要はほとんどありません。disposeこの自動的なケースでは、メソッドが呼び出されていないように見えるため、「破棄」を引用符で囲んでいます。

Swing のパブリック メソッドは呼び出し用に用意されていることに注意してください必ずしもすべてが Swing の内部で呼び出されるわけではありません。たとえば、setSize()andsetLocation()setBounds()メソッドがあります。前者の 2 が後者を呼び出すか、またはその逆か 定義されていないため、想定しないでください。

同様に、フレームが閉じたときに何かをしたい場合、それを確実にする方法は、WindowListenerをフレームにフックし、閉じるアクションを に入れることwindowClosing()です。

于 2009-12-13T11:13:23.180 に答える
1

windowClosing() メソッドが実装された WindowListener を追加しようとしましたか? これにより、破棄または終了の時期がわかります。

編集:試してみました-windowClosing()ではなくdispose()で何かをする必要があるかどうかに応じて、仕事をする必要があります。

于 2009-12-13T09:58:30.020 に答える
0

EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE の代わりに入れたら動きますか?

于 2013-04-09T11:58:01.813 に答える