web-dev-qa-db-ja.com

JFrame終了時の終了Java

このコードをどのように使用できるのかわかりません:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

xボタンでプログラムを閉じます。

50
user983246

あなたはラインが必要です

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Xボタンを押したときのJFrameのデフォルトの動作は、

frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

そのため、ほとんどの場合、JFrameの作成時にその行を手動で追加する必要があります。

私は現在、WindowConstantsで直接宣言されている同じ定数ではなく、JFrameのような定数をWindowConstants.EXIT_ON_CLOSEのように参照しています。

76
Jaime Hablutzel

持っていない場合、JFrameは破棄されます。フレームは閉じますが、アプリは引き続き実行されます。

6
Jeff Storey

setDefaultCloseOperation(EXIT_ON_CLOSE)を呼び出すと、まさにこれが行われます。アプリケーションがオペレーティングシステムからウィンドウを閉じるイベントを受信すると、アプリケーションが終了します。ウィンドウのclose (X)ボタンを押すと、オペレーティングシステムはウィンドウを閉じるイベントを生成し、Javaアプリケーションに送信します。ウィンドウを閉じるイベントは、JavaアプリケーションのAWTイベントループによって処理され、イベントに応答してアプリケーションを終了します。

このメソッドを呼び出さないと、AWTイベントループはウィンドウを閉じるイベントに応答してアプリケーションを終了せず、バックグラウンドで実行したままになる場合があります。

4
Brian Coleman

これに対するエレガントな解決策を得るために、私はかなりの時間をインターネットを通して探索しました。通常そうであるように、私は多くの矛盾する情報を見つけました。

私は最終的に終了しました:

  1. EXIT_ON_CLOSEを使用しないでください。使用するとリソースが残る可能性があります。
  2. JFrameの初期化では、次のようなものを使用してください。

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  3. 本当の発見は、ウィンドウメッセージを実際にJFrameにディスパッチする方法でした。例として、アプリケーションを終了するためのJMenuItemの一部として、次を使用します。関数getFrame()はJFrameへの参照を返します。

    public class AppMenuFileExit extends JMenuItem implements ActionListener
    {
        // do your normal menu item code here
    
          @Override
          public void actionPerformed(ActionEvent e)
          {
            WindowEvent we;
            we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
    
            App.getFrame().dispatchEvent(we);
          }
    }
    

    JFrameはWindowのサブクラスであるため、この目的のためにWindowにキャストできます。

  4. また、Windowメッセージを処理するために、JFrameクラスに次のものを含めます。

    public class AppFrame extends JFrame implements WindowListener
    {
      // Do all the things you need to for the class
    
      @Override
      public void windowOpened(WindowEvent e)
      {}
      @Override
      public void windowClosing(WindowEvent e)
      {/* can do cleanup here if necessary */}
    
      @Override
      public void windowClosed(WindowEvent e)
      {
        dispose();
        System.exit(0);
      }
      @Override
      public void windowActivated(WindowEvent e)
      {}
      @Override
      public void windowDeactivated(WindowEvent e)
      {}    
      @Override
      public void windowDeiconified(WindowEvent e)
      {}
      @Override
      public void windowIconified(WindowEvent e)
      {}
    }
    
3
Higgs

フレーム(クラス拡張フレーム)を使用している場合は、

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
1
Yacine

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

これはクラス拡張フレームの場合に私のために働いた

0
Aditya Joshi

JFrameを拡張せず、変数でJFrame自体を使用しない場合は、次を使用できます。

frame.dispose();
System.exit(0);
0
Dmitriy Potapov

次のコードは私のために機能します:

System.exit(home.EXIT_ON_CLOSE);