web-dev-qa-db-ja.com

プログラムでJFrameを閉じる方法

JFrameを閉じるための正しい方法は何ですか。ユーザーがXの閉じるボタンを押したか、または押された場合と同じです。 Alt+F4 (Windowsの場合)

次のようにして、デフォルトのクローズ操作を希望通りに設定します。

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

それはまさに私が前述のコントロールで欲しいことをします。この質問はそれについてではありません。

私が本当にやりたいことは、X閉じるボタンを押しても同じようにGUIが動作するようにすることです。

WindowAdaptorを拡張し、次にaddWindowListener()を介して私のアダプタのインスタンスをリスナーとして追加するとします。 X閉じるボタンと同じように、windowDeactivated()windowClosing()、およびwindowClosed()を介した呼び出しの同じシーケンスを見たいと思います。ウィンドウを引き裂くように指示するほどウィンドウを引き裂くわけではありません。

232
JustJeff

GUIをX closeボタンをクリックした場合と同じように動作させる場合は、ウィンドウを閉じるイベントをWindowに送出する必要があります。 ExitAction from アプリケーションを閉じる を使用すると、メニュー項目またはActionを簡単に使用するコンポーネントにこの機能を追加できます。

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
296
camickr
setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object

面倒ではありません。

122
Alex

Alt-F4またはXで「他のWindowsまたはスレッドが実行されているかどうかに関係なくアプリケーションをすぐに終了する」という意味であれば、System.exit(...)正確にを実行します。非常に突然の、力ずくの、そしておそらく問題のあるやり方。

Alt-F4またはXでウィンドウを隠すということであれば、frame.setVisible(false)はウィンドウを「閉じる」方法です。ウィンドウはリソース/メモリを消費し続けますが、非常に早く再び見えるようにすることができます。

Alt-F4またはXでウィンドウを非表示にしてそれが消費しているリソースを処分することを意味する場合、frame.dispose()はウィンドウを「閉じる」方法です。フレームが最後に表示されていたウィンドウで、他にデーモンではないスレッドが実行されていなければ、プログラムは終了します。ウィンドウをもう一度表示すると、ネイティブリソース(グラフィックスバッファ、ウィンドウハンドルなど)をすべて再初期化する必要があります。

dispose()はあなたが本当に望む振る舞いに最も近いかもしれません。アプリで複数のウィンドウが開いている場合は、Alt-F4またはXでアプリを終了しますか、それともアクティブなウィンドウを閉じますか?

ウィンドウリスナーに関する Java Swingチュートリアル があなたのために物事を明確にするのを助けるかもしれません。

25
James Schek

ユーザーがウィンドウを閉じることができないようにするためにこれを行ったとします。

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

それならpullThePlug()メソッドを

public void pullThePlug() {
    // this will make sure WindowListener.windowClosing() et al. will be called.
    WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);

    // this will hide and dispose the frame, so that the application quits by
    // itself if there is nothing else around. 
    setVisible(false);
    dispose();
    // if you have other similar frames around, you should dispose them, too.

    // finally, call this to really exit. 
    // i/o libraries such as WiiRemoteJ need this. 
    // also, this is what swing does for JFrame.EXIT_ON_CLOSE
    System.exit(0); 
}

私はこれがWindowListenerJFrame.DO_NOTHING_ON_CLOSEでNiceを演じる唯一の方法であることがわかりました。

15
Gazihan Alankus

これはあなたのオプションになります:

System.exit(0); // stop program
frame.dispose(); // close window
frame.setVisible(false); // hide window
8
Arin

実行中のJavaプロセスを終了するのはとても簡単です。基本的には2つの簡単なことをする必要があります。

  1. アプリケーションの終了時にJavaメソッドSystem.exit(...)を呼び出します。たとえば、アプリケーションがフレームベースの場合は、リスナーWindowAdapterを追加して、そのメソッドSystem.exit(...)内でwindowClosing(WindowEvent e)を呼び出すことができます。

注:System.exit(...)を呼び出す必要があります。そうしないと、プログラムにエラーが発生します。

  1. Exitメソッドを常に呼び出すことができるようにするための予期しないJava例外の回避正しい場所にSystem.exit(...)を追加しても、メソッドが常に呼び出されるわけではありません。予期しないJavaの例外がメソッドの呼び出しを妨げる可能性があるためです。

これはあなたのプログラミングスキルと強く関係しています。

**以下はexitメソッドを呼び出す方法を示す最も簡単なサンプル(JFrameベース)です。

import Java.awt.event.*;
import javax.swing.*;

public class ExitApp extends JFrame
{
   public ExitApp()
   {
      addWindowListener(new WindowAdapter()
      {
         public void windowClosing(WindowEvent e)
         {
           dispose();
           System.exit(0); //calling the method is a must
         }
      });
   }

   public static void main(String[] args)
   {
      ExitApp app=new ExitApp();
      app.setBounds(133,100,532,400);
      app.setVisible(true);
   }
}
8
Jaimin Patel

JFrameを閉じるだけでなく、WindowListenerイベントをトリガするためにも、これを試してください。

myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));
7
niranaam

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

JFrameを閉じるだけでなく、アプリケーション全体をシャットダウンするため、 "EXIT ON CLOSE"

同じ結果を得るには、アプリケーションを効果的に終了する必要があります。

 System.exit(0);

効果はまったく同じです。

5
OscarRyz

JFrameが閉じられたときにアプリケーションを本当に終了させたくない場合は、

使用してください:setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

代わりに:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

これは解がどのように見えるかの概要です、

 myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));
4
Harita M

Swingフレームをプログラムで閉じる最も良い方法は、 "X"ボタンが押されたときのように振る舞うようにすることです。そのためには、あなたのニーズに合ったWindowAdapterを実装し、frameのデフォルトのcloseオペレーションを何もしないように設定する必要があります(DO_NOTHING_ON_CLOSE)。

このようにフレームを初期化します。

private WindowAdapter windowAdapter = null;

private void initFrame() {

    this.windowAdapter = new WindowAdapter() {
        // WINDOW_CLOSING event handler
        @Override
        public void windowClosing(WindowEvent e) {
            super.windowClosing(e);
            // You can still stop closing if you want to
            int res = JOptionPane.showConfirmDialog(ClosableFrame.this, "Are you sure you want to close?", "Close?", JOptionPane.YES_NO_OPTION);
            if ( res == 0 ) {
                // dispose method issues the WINDOW_CLOSED event
                ClosableFrame.this.dispose();
            }
        }

        // WINDOW_CLOSED event handler
        @Override
        public void windowClosed(WindowEvent e) {
            super.windowClosed(e);
            // Close application if you want to with System.exit(0)
            // but don't forget to dispose of all resources 
            // like child frames, threads, ...
            // System.exit(0);
        }
    };

    // when you press "X" the WINDOW_CLOSING event is called but that is it
    // nothing else happens
    this.setDefaultCloseOperation(ClosableFrame.DO_NOTHING_ON_CLOSE);
    // don't forget this
    this.addWindowListener(this.windowAdapter);
}

このようにWINDOW_CLOSINGイベントを送ることで、プログラム的にフレームを閉じることができます。

WindowEvent closingEvent = new WindowEvent(targetFrame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);

"X"ボタンが押されたようにこれはフレームを閉じます。

4
stjepano

ここですでに提供された答えに基づいて、これは私がそれを実行した方法です:

JFrame frame= new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// frame stuffs here ...

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

JFrameはイベントをクローズしてクローズし、終了すると終了します。

3
Megatron

この答えはアレックスによって与えられました、そして、私はそれを推薦したいです。それは私のために働きました、そしてもう一つのそれは簡単でとても単純なことです。

setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object
3
Humphrey

この例では、確認済みウィンドウを閉じる操作を実現する方法を示します。

ウィンドウには、OptionDialogの回答に応じて、デフォルトのclose操作をEXIT_ON_CLOSEまたはDO_NOTHING_ON_CLOSEに切り替えるウィンドウアダプタがあります。

closeWindowのメソッドConfirmedCloseWindowはウィンドウを閉じるイベントを発生させ、どこでも使用できます。つまり、メニュー項目のアクションとして使用できます。

public class WindowConfirmedCloseAdapter extends WindowAdapter {

    public void windowClosing(WindowEvent e) {

        Object options[] = {"Yes", "No"};

        int close = JOptionPane.showOptionDialog(e.getComponent(),
                "Really want to close this application?\n", "Attention",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.INFORMATION_MESSAGE,
                null,
                options,
                null);

        if(close == JOptionPane.YES_OPTION) {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.EXIT_ON_CLOSE);
        } else {
           ((JFrame)e.getSource()).setDefaultCloseOperation(
                   JFrame.DO_NOTHING_ON_CLOSE);
        }
    }
}

public class ConfirmedCloseWindow extends JFrame {

    public ConfirmedCloseWindow() {

        addWindowListener(new WindowConfirmedCloseAdapter());
    }

    private void closeWindow() {
        processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
    }
}
3
rkd

すべてのタイミングが正しく行われるようにAWTメッセージキューに呼び出しを挿入する必要があります。そうしないと、特にマルチスレッドプログラムでは正しいイベントシーケンスが送出されません。これが完了すると、OSが装飾されたJFrameを補完するためにユーザーが[x]ボタンをクリックした場合とまったく同じように、結果のイベントシーケンスを処理できます。

public void closeWindow()
{
    if(awtWindow_ != null) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING));
            }
        });
    }
}
2
peterk

私はこれを試してみました、formWindowClosing()イベントのためにあなた自身のコードを書いてください。

 private void formWindowClosing(Java.awt.event.WindowEvent evt) {                                   
    int selectedOption = JOptionPane.showConfirmDialog(null,
            "Do you want to exit?",
            "FrameToClose",
            JOptionPane.YES_NO_OPTION);
    if (selectedOption == JOptionPane.YES_OPTION) {
        setVisible(false);
        dispose();
    } else {
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
    }
}    

これにより、ユーザーがフレームまたはアプリケーションを終了するかどうかを尋ねられます。

2
r_D

JFrameが閉じられたときにアプリケーションを終了させたくない場合は、setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)を使用してください。

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ではなく、

ドキュメントから:

DO_NOTHING_ON_CLOSE (defined in WindowConstants):何もしません。登録されたWindowListenerオブジェクトのwindowClosingメソッドで操作を処理するようプログラムに要求します。

HIDE_ON_CLOSE (defined in WindowConstants):登録されたWindowListenerオブジェクトを呼び出した後に自動的にフレームを隠します。

DISPOSE_ON_CLOSE (defined in WindowConstants):登録されたWindowListenerオブジェクトを呼び出した後、自動的にフレームを隠して破棄します。

EXIT_ON_CLOSE (defined in JFrame):システムのexitメソッドを使ってアプリケーションを終了します。アプリケーションでのみこれを使用してください。

それでも便利かもしれません:同じフレームをもう一度表示したい場合は、JFrameでsetVisible(false)を使うことができます。それ以外の場合は、dispose()を呼び出してネイティブ画面リソースをすべて削除します。

peter Langからコピー

https://stackoverflow.com/a/1944474/3782247

1
Mena Nashaat

質問の本文にあったものをCW回答として投稿する。

主にcamickrのリンクをたどって得られた結果を共有したいと思った。基本的に私はWindowEvent.WINDOW_CLOSINGをアプリケーションのイベントキューに投入する必要があります。これが解がどのように見えるかの概要です。

// closing down the window makes sense as a method, so here are
// the salient parts of what happens with the JFrame extending class ..

    public class FooWindow extends JFrame {
        public FooWindow() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(5, 5, 400, 300);  // yeah yeah, this is an example ;P
            setVisible(true);
        }
        public void pullThePlug() {
                WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
                Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
        }
    }

// Here's how that would be employed from elsewhere -

    // someplace the window gets created ..
    FooWindow fooey = new FooWindow();
    ...
    // and someplace else, you can close it thusly
    fooey.pullThePlug();
1
Vogel612
 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
0
Itay Maman