2010-11-28 20 views
2

メインアプリケーションのウィンドウ(必要に応じてログ)にJTextAreaが常に表示され、システムで行われているアクティビティを表示するために使用したい(mock-debugなど場合は、System.out.println()の場合は、何かの場合は、出力)別の場所からスイングJTextAreaへのメッセージの送信

私はユーザーが行う高レベルのことを意味します(「ファイルが正常に読み込まれました」や「ディスクに書き込まれました」、「完了」など) )

このようなメッセージは、私のシステムのどこにでも生成することができ、主にデータと計算を扱うクラスの別のパッケージで生成され、GUIを認識しません。

テンポラリファイルにメッセージを保存して、テキストアレイがそのファイルを変更して「監視」している可能性があります。どのようにすることができますか?

答えて

5

最も簡単な方法は、ロガー・インターフェースを定義することです:今

public class FileLoader { 

    private ActivityLogger logger; 
    public FileLoader(ActivityLogger logger){ 
     this.logger = logger; 
    } 

    public void loadFile(){ 
     // load stuff from file 
     logger.logAction("File loaded successfully"); 
    } 

} 

:彼らは具体的な実装に縛られませんので、

package com.example.logging; 
public interface ActivityLogger { 
    void logAction(String message); 
} 

次に、あなたの非GUIコンポーネントに渡しますテキストコンポーネントに書き込む実装は簡単です:

public class TextComponentLogger implements ActivityLogger{ 
    private final JTextComponent target; 
    public TextComponentLogger(JTextComponent target) { 
     this.target = target; 
    } 

    public void logAction(final String message){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       target.setText(String.format("%s%s%n", 
              target.getText(), 
              message)); 
      } 
     }); 
    } 
} 
// Usage: 
JTextArea logView = new JTextArea(); 
TextComponentLogger logger = new TextComponentLogger(logView); 
FileLoader fileLoader = new FileLoader(logger); 
fileLoader.loadFile(); 

もちろん可能です標準のロギングフレームワーク(java.util.logging、slf4j、log4jなど)を使用し、テキストコンポーネントに「書き込む」アペンダーを作成します。

0

デザインがかなり複雑になる可能性があります。おそらく、TextAreaが存在するクラスでupdateText()のようなパブリックアクセスメソッドを持つことができます。次に、main()の実行時に一緒に初期化される 'リソース'クラスまたは「共有」クラス(単純なクラス)を作成します。 TextAreaを含むクラスが作成されると、インスタンスは '共有'クラス(この共有クラスはシングルトンにする必要があります)に配置され、他のすべてのクラスはこの '共有'クラスを呼び出します(おそらくupdateTextAreaそれが行うことは、そのインスタンスを介してTextAreaを含むクラスを呼び出し、TextAreaを呼び出してテキストを更新することです。

0

Message Consoleがあなたが探しているものかもしれません。

Javaには「Logger」APIもあります。

0

EventBusを使用すると、GUIをアプリケーションの他の部分と切り離すことができます。 (私のブログはintroductionです)。あなたはおそらく1は、特定の実装に縛られることなく、それを使用できるように、別のクラスに話題宣言を移動したいと思い、実際のシステムでは

public class LogArea extends JTextArea { 
    public static final String LOG_TOPIC = "logarea_topic"; 

    public LogArea() { 
     super(); 
     // Read in the annotations, register self as a listener to the topic 
     AnnotationProcessor.process(this); 
    } 

    @EventTopicSubscriber(topic=LOG_TOPIC) 
    public void logEvent(String topic, String text) { 
     append(text + "\n"); 
    } 

} 

public class DomainClass { 

    public void foo() { 
     // Send out a notification throughout the system to whichever components 
     // are registered to handle this topic. 
     EventBus.publish(LogArea.LOG_TOPIC, "some text you want to appear in the log area"); 
    } 

} 

を次のようにあなたは何かを行うことができます。例えば。トピックの静的な文字列定数だけを含むトピッククラスを持つことができます。次に、これらのトピックを聞き取り、メッセージを処理する複数のクラスを持つことができます(たとえば、jtextareaコンポーネントに加えてログファイルに書き出す標準的なログフレームワークを使用できます)。

関連する問題