2016-04-26 9 views
2

WindowAdapterから継承するクラスを作成しました。そのため、ウィンドウを閉じるたびに、本当にウィンドウを閉じるかどうかを尋ねます。問題は「いいえ」をクリックすると発生します。ウィンドウイベントがそこに残らず、フレームがそれをディスパッチしようとするように、どうすれば処理できますか? 私はリターンしかしません。私は何も思い付きません。ここでは、コードがあります:ウィンドウイベントを送出するWindowAdapter(終了ウィンドウ)

public class ExitController extends WindowAdapter{ 

    @Override 
    public void windowClosing(WindowEvent windowEvent) { 
     if(JOptionPane.showConfirmDialog(null,"Are you sure to close this window?", 
     "Really Closing?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) 
     == JOptionPane.YES_OPTION){ 
        System.exit(0); 
       } else { 
        return; 
       } 
      } 
     } 
+0

ここでやることはうまくいくはずです。他のリスナーもイベントを受信します。 –

答えて

1

問題はJFrame.processWindowEventである:

protected void processWindowEvent(WindowEvent e) { 
    super.processWindowEvent(e); // --> this will call your listener 

    if (e.getID() == WindowEvent.WINDOW_CLOSING) { 
     switch(defaultCloseOperation) { 
      case HIDE_ON_CLOSE: 
      setVisible(false); 
      break; 
      case DISPOSE_ON_CLOSE: 
      dispose(); 
      break; 
      case DO_NOTHING_ON_CLOSE: 
      default: 
      break; 
      case EXIT_ON_CLOSE: 
       // This needs to match the checkExit call in 
       // setDefaultCloseOperation 
      System.exit(0); 
      break; 
     } 
    } 
} 

独自にリスナーが何をするかの、JFrameはそのdefaultCloseOperationを評価し、自分自身を閉じたり非表示になります。これを容易にするために、あなたはExitListener方法を提供することができ

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new ExitController()); 

は、したがって、あなたは、デフォルトの動作を防止するために、あなたのリスナーをインストールするフレームの右側のデフォルトクローズ操作を初期化するためにも必要

public class ExitController extends WindowAdapter { 
    public void installOn(JFrame frame) { 
     frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(this); 
    } 
+0

私はすでにそれをしています。問題は実際には、私はインターフェイスと対話し、パネルが変化すると、リターンコールはそれらのすべてを通過し、同じ(ウィンドウ)イベントをディスパッチしようとして、確認ダイアログ(新しいポップアップ)を表示し続けることです。それを消費する方法はありますか? – jari

+0

@ Jariあなたの質問に、効果を示す小さなサンプルプログラムを追加する必要があります... – wero

+0

動作していないようです...「メソッドAWTEventからメソッドconsume()が見えません」と表示されます。 – jari

2

チェックアウトClosing an Application

これにはいくつかの基本的なコードがあります。基本コードは、フレームのデフォルトのクローズ操作をDO_NOTHING_ON_CLOSEに設定します。

次に、ユーザーが閉じることを確認すると、System.exit(0)ではなく、デフォルトのクローズ操作がEXIT_ON_CLOSEにリセットされます。

ExitControllerクラスのより複雑なバージョン(より多くの機能を提供するため)であるCloseListenerクラスを使用することもできます。

関連する問題