2012-05-04 6 views
1

いくつかのデータを処理するGUIアプリケーションがあり、テキスト行をオブジェクトに変換します。作成される各オブジェクトは、JTextAreaのJTextPaneに表示されます。例:スイングコンポーネントinitを持たないスレッドからJTextArea(またはJTextPane)にデータをログする方法は?

ライン#1 827401830 ライン#2を作成したがしたがって、ユーザーがプロセスのお知らせです827401831

を作成しました。

シーンの背後には、バックグラウンドで実行されるスレッドがあり、すべての作業を行います。問題は、このスレッドのフィールドの1つにJTextAreaがあることです。したがって、上記のコードは正常に動作して仕事をしていませんが、時々私はないGUIからこのスレッドを使用していますし、私がいないためJTextAreaのをインスタンス化しています

public class ConsumerThread implements Runnable 
{ 
    private ArrayBlockingQueue<TicketExchangeLine> queue; 
    private JTextArea textArea; 

public ExchConsumerThread(ArrayBlockingQueue<TicketExchangeLine> queue, JTextArea textArea) 
{ 
    this.queue = queue; 
    this.textArea = textArea; 
} 

public void run() 
{ 
    try 
    {  
     while (true) 
     {    
      // check if end of file from producer POV 
      if (queue.peek()!=null && ...) 
       break; 

      MyObject obj = queue.take(); 

      try{ 
       //do the process here 
       textArea.append("here comes the output for the user..."+obj.getID); 

      }catch(Exception nfe) 
      { 
       //Oops 
      } 
     } 

     textArea.append("\nDone!"); 

    }catch (InterruptedException e) 
    { 
     // Oops 
    }catch(Exception exp) 
    { 
     exp.printStackTrace(); 
    } 
} 

}

:それはこのようになります理由;さらに悪いことに、私はプロセスを見るためにすべてsystem.outする必要があります。

質問スレッド内のSwingコンポーネントを使用せずに、JTextArea(またはいつかJTextPane)にすべての '処理されたデータ'を記録するにはどうすればよいですか?

ありがとうございます!

答えて

2

代わりJTextAreaを渡す、OutputStream(例えばを渡しますa PrintStream)をパラメータとする。これは、十分な柔軟性を提供します:

  • あなたのスレッドはちょうどあなたが、出力がJTextAreaに表示したい場合は、あなたがJTextAreaに出力を追加しますOutputStreamを渡すのOutputStream
  • に書き込みます。テキスト領域への書き込みはEDTで行われるべきですが、出力ストリームがこれを処理します。あなたのスレッドは、あなたがSystem.outにパイプに出力したい場合は、あなただけのパラメータとして直接
+0

'OutputStream'を使う代わりに、バイトの代わりに文字を扱う 'Writer'を使うことさえできます。 – Jeffrey

0

ないそれはあなたが達成しようとしているものですが、あなたの現在のコードで、あなたがこのようなEDTにJTextAreaのを変えることができるかどうかわから:

final MyObject obj = queue.take(); 
try { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      textArea.append("here comes the output for the user..." + obj.getID); 
     } 
    }); 
} 
+0

しかし、あなたはまだスレッドににtextAreaを送っています。私の目的は、TextAreaが聞くことができるものをString(log4j)に記録することです。 – adhg

+1

ああ私はそれが存在するかどうかはわかりません...私はlog4jを意味します。その要件は石で設定されていますか?あなたがグローバルな静的ログメソッドを持っていれば十分ではないでしょうか? – Thihara

+0

あなたはカスタムリスナーをセットアップすることができますが、あなたはどこかで中間の場所に書き込む必要がありますが、グローバルな静的メソッドははるかにクリーンなようです..... – Thihara

1

System.outを渡すこの

  • の気づかないほとんどは、グラフィカルコンポーネントはグラフィカルな表現(ビュー)に分割されているスイングと表示されたデータ(モデル)の抽象表現。 JTextAreaおよびJTextPaneは、モデルとしてDocumentインスタンスを使用するグラフィカルコンポーネントです。

    したがって、JTextAreaを参照してtextArea.appendを呼び出す代わりに、ドキュメントを参照してdocument.insertStringを呼び出すことができます。次に、JTextAreaをインスタンス化する必要がある場合は、Documentを引数として持つJTextAreaのコンストラクタを使用します(またはそのsetDocumentメソッドを使用します)。

    また、Swingはスレッドセーフではなく、Swingコンポーネントに影響するすべてのメソッド呼び出しは、EDT(AWTのディスパッチスレッド)で発生する必要があります。 EDTにコードを挿入するには、SwingUtilities.invokeLaterを使用します。あなたが既に持っているように見える

  • 関連する問題