2011-01-19 14 views
4

これは愚かな質問かもしれませんが、私はJavaには新しく、悪い習慣を開発する前に正しい方法で自分自身を教えようとしています。Javaでのウィンドウの処理と終了

とにかく、昨夜、Frameを拡張するカスタムクラスとCanvasを拡張するカスタムクラスからなるプログラムを作成していました。 main()メソッドはキャンバスクラスにあり、そこでフレームクラスのインスタンスを作成します。問題は、プログラムがウィンドウクローズイベントを検出したときに、メインメソッドの外側からアクセスできないように見えるため、フレームを破棄できないということです。私がmain()の外で定義しようとすると、その中で使うことはできません。だから私はdispose()をスキップし、System.exit(0)だけを使用しました。これは大丈夫ですか?それは基本的に同じことをやっているのですか?または、これは私が修正する必要がある問題ですか、もしそうなら、どんな考えですか?読書のための

本当にありがとうございましたが、

コーディ

+0

System.exit(0)は実行中のJVMを終了するので、注意してください帽子。そのjvmの中で実行しているアプリケーションだけではないかもしれません。 – fmucar

答えて

5

あなたはのsourceプロパティから、フレームへの参照を取得することができますイベント:あなたも書くことができますので、これは匿名クラスであるため、

class MyWindowListener extends WindowAdapter { 

    public void windowClosing(WindowEvent e){ 
     Frame frame = (Frame) e.getSource(); 
     frame.dispose(); 
    } 

} 

また、(おそらく)コンストラクタ内で宣言は、あなたも、親インスタンスへのアクセス権を持っていることのように:

class MyFrameClass extends Frame { 
    public MyFrameClass() { 
     this.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent e){ 
       MyFrameClass.this.dispose(); 
      } 
     }); 
    } 
} 

または(あなたのWindowListenerは "処分" と呼ばれる独自の方法を持っていないよう)あなたはまだそれを簡単にすることができます。親ウィンドウで

public void windowClosing(WindowEvent e){ 
    dispose(); 
} 
+0

ありがとうございます。それははるかに理にかなっています。 getSourceの出力をフレームとしてキャストして使用することはありませんでした。 – Keysmack

5

ない愚かな質問。しかし、ガベージコレクタは大きな問題ではないので、ウィンドウが閉じたときにクリーンアップを実行する必要がある場合があります。したがって、いくつかの提案:

フレーム終了イベントは、フレーム自体から処理する必要があります。例えば:

this.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent e){ 
        //code here to perform as the window is about to close. 
     } 
     }); 

そして、私はあなたがフレームを呼び出しますあなたの主な方法のための別のクラスを作成することを示唆しているなど

+0

お返事ありがとうございます。私は私の主な方法に別のクラスを使用しようとします。そんなに清潔に思えます。 – Keysmack

0
This is used to close Jframe with an event handler. 


current Jframe 

public class LoginForm extends JFrame 
{ 

    LoginForm() 
    { 
     //Some code for Jframe and its components. 
     if(Condition) 
     disposewindow(); 
    } 




private void disposewindow() 
     { 
      WindowEvent closingEvent = new WindowEvent(LoginForm.this, 
                  WindowEvent.WINDOW_CLOSING); 
      Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent); 

     } 



//you can can use for alternate of dispose()event and it post some event handler **Closing event** , 

// if we can use this closing event to open new window with conditions. 

//It means closing child window with closing event, get this flag in main window to make main window as Disable or Enable state 

}

//を @Override

public void windowClosing(WindowEvent arg0) { 

     // TODO Auto-generated method stub 
     this.frame.disable(); 
    } 
関連する問題