2

JTextAreaをメインアプリウィンドウ(必要に応じてログ)に常に表示していて、それを使用してシステムで進行中のアクティビティを表示したいと思います(System.out.println(で行うモックデバッグ出力など) )条件などで)

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

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

たぶん、メッセージを一時ファイルに保存し、textareaがそのファイルの変更を「監視」しますが、これはどのように行うことができますか?

4

4 に答える 4

5

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

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

次に、それを非GUIコンポーネントに渡して、特定の実装に縛られないようにします。

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");
    }

}

これで、テキストコンポーネントに書き込む実装を作成するのは簡単です。

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など)を使用して、テキストコンポーネントに「書き込む」アペンダーを作成することもできます。

于 2010-11-28T16:43:40.170 に答える
0

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

于 2010-11-28T16:30:53.307 に答える
0

メッセージコンソールはあなたが探しているものかもしれません。

Javaには「ロガー」APIもあります。

于 2010-11-28T16:30:54.360 に答える
0

EventBusを使用して、GUIをアプリケーションの他の部分から切り離すことができます。(私のブログには別の紹介があります)。あなたは次のように何かをすることができます:

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");
    }

}

実際のシステムでは、トピック宣言を別のクラスに移動して、特定の実装に縛られることなく使用できるようにする必要があります。たとえば、トピックの静的文字列定数のみを含むTopicsクラスを作成できます。次に、それらのトピックをリッスンしてメッセージを処理する複数のクラスを作成できます(たとえば、jtextareaコンポーネントに加えてログファイルに書き出す標準のログフレームワークを作成できます)。

于 2010-11-28T20:03:47.737 に答える