このコードをどのように使用できるのかわかりません:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
xボタンでプログラムを閉じます。
あなたはラインが必要です
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Xボタンを押したときのJFrameのデフォルトの動作は、
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
そのため、ほとんどの場合、JFrameの作成時にその行を手動で追加する必要があります。
私は現在、WindowConstants
で直接宣言されている同じ定数ではなく、JFrame
のような定数をWindowConstants.EXIT_ON_CLOSE
のように参照しています。
持っていない場合、JFrameは破棄されます。フレームは閉じますが、アプリは引き続き実行されます。
setDefaultCloseOperation(EXIT_ON_CLOSE)
を呼び出すと、まさにこれが行われます。アプリケーションがオペレーティングシステムからウィンドウを閉じるイベントを受信すると、アプリケーションが終了します。ウィンドウのclose (X)ボタンを押すと、オペレーティングシステムはウィンドウを閉じるイベントを生成し、Javaアプリケーションに送信します。ウィンドウを閉じるイベントは、JavaアプリケーションのAWTイベントループによって処理され、イベントに応答してアプリケーションを終了します。
このメソッドを呼び出さないと、AWTイベントループはウィンドウを閉じるイベントに応答してアプリケーションを終了せず、バックグラウンドで実行したままになる場合があります。
これに対するエレガントな解決策を得るために、私はかなりの時間をインターネットを通して探索しました。通常そうであるように、私は多くの矛盾する情報を見つけました。
私は最終的に終了しました:
EXIT_ON_CLOSE
を使用しないでください。使用するとリソースが残る可能性があります。JFrameの初期化では、次のようなものを使用してください。
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
本当の発見は、ウィンドウメッセージを実際に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にキャストできます。
また、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)
{}
}
フレーム(クラス拡張フレーム)を使用している場合は、
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
これはクラス拡張フレームの場合に私のために働いた
JFrame
を拡張せず、変数でJFrame
自体を使用しない場合は、次を使用できます。
frame.dispose();
System.exit(0);
次のコードは私のために機能します:
System.exit(home.EXIT_ON_CLOSE);