2016-07-05 6 views
-1

次のような状況があります。私のプログラムは、テキスト付きのJFrameを繰り返し表示するようなものを繰り返し呼び出します。私はそのフレームからテキストを読みました。フレームには特殊な型があります。それをMyFrameTypeと呼ぶことにしましょう。型で認識し、各呼び出しの終わりに、私が知っているフレームを閉じるすべての方法でフレームを破棄します。 )ループ内で今消えないJFrame

callMyFrame(); 
Frame[] frames = Frame.getFrames(); 
for (Frame openFrame : frames) { 
    if (openFrame instanceof MyFrameType) { 
     MyFrameType myFrame = (MyFrameType) openFrame; 
     (do something, read the frame etc.) 
     myFrame.setVisible(false); 
     myFrame.dispose(); 
     myFrame.dispatchEvent(new WindowEvent(
             myFrame, 
             WindowEvent.WINDOW_CLOSED)); 
     break; 
    } 
} 

で、問題がある:フレームが実際に閉じられますしながら、(常に何らかの理由で最後フレームの場合ではありませんこれは - 時にはそれが閉じます、時々ではありません)、クローズドフレームはまだフレーム配列によってリストされ、プログラムは間違ったフレームからの読み込みを終了します - 最初に見つかったMyFrameType、実際に開いているのは1つだけです。 getFrames()は、アプリケーションによって作成されたすべてフレームを取得します。しかし、これらの配置されたフレームをどのように除外して、以前に作成されたランダムなフレームを選択するだけではありませんか?問題のフレームには所有者がいないので、所有者がいないフレームを削除しても機能しません。 JFrameここで、表示可能である場合は、単に確認することができ

+0

フレームを廃棄するときには、 'frames'配列もう一度それを訪問することを避けるために? –

+2

説明はこのアプリを作る。エンドユーザーにとって恐ろしい経験のように聞こえる。 [複数のJFramesの使い方、良い/悪い練習](http://stackoverflow.com/q/9554636/418556)を参照してください。この場合、フレームはおそらくダイアログであり、数多くの代わりにちょうど1、それへの参照を保持し、それが必要なテキストとそれを表示します。 –

+0

'callMyFrame()'によって呼び出されたプログラムは私のものではないので、何も変更することはできません。多くのフレーム(それぞれのループに配置されています)でなければなりません。 – alexmagnus

答えて

0

はあなたが確認するために使用できる簡単な例です:

JFrame jFrame = new JFrame(); 
jFrame.setVisible(true); 
jFrame.dispose(); 
System.out.println(jFrame.isDisplayable()); 

出力:だから

false 

あなたのループではなく、単にチェックしますJFrameinstanceofMyFrameTypeをされている場合は行うことができます。

for (Frame openFrame : frames) { 
    if (openFrame instanceof MyFrameType && openFrame.isDisplayable()) { 
    } 
} 
+0

これは助けました。' isDisplayable'メソッドを見たのですが、これは役に立ちました。その機能が不明です。 – alexmagnus

0

配列内のフレームをnullに設定するか、それ以外の場合は "削除"する必要があります。また、これを行うには、for-loopの代わりに標準のfor-loopを使う必要があります。

Frame[] frames = Frame.getFrames(); 
    for(int i=0; i<frames.length; i++) { 
     if (frames[i] instanceof MyFrameType) { 
      (do something, read the frame etc.) 
      frames[i].setVisible(false); 
      frames[i].dispose(); 
      frames[i].dispatchEvent(new WindowEvent(
        frames[i], 
        WindowEvent.WINDOW_CLOSED)); 
      frames[i] = null; 
      break; 
     } 
    } 
関連する問題