从不同的地方向swing JTextArea发送消息

Rec*_*cct 2 java swing jtextarea

我的主应用程序窗口中总是可以看到JTextArea(如果你愿意,可以使用日志),我想用它来显示系统中正在进行的活动(比如你用System.out.println做的模拟调试输出)( )如果条件或其他)

我指的是用户所做的高级事情(例如"成功加载文件"或"写入磁盘","已完成"等)

事情就是这样的消息可以在我的系统中的任何地方生成,主要是在另一个包中处理数据和计算的包中,并且他们不知道GUI.

也许将消息保存到临时文件中并且textarea"监视"该文件的更改,如何才能完成?

gus*_*afc 5

最简单的方法是定义记录器接口:

package com.example.logging;
public interface ActivityLogger {
    void logAction(String message);
}
Run Code Online (Sandbox Code Playgroud)

然后将它传递给非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");
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,创建一个写入文本组件的实现很简单:

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();
Run Code Online (Sandbox Code Playgroud)

您当然也可以使用标准日志记录框架(java.util.logging,slf4j,log4j等)并编写一个"写入"文本组件的appender.