Самый простой способ - определить интерфейс регистратора:
package com.example.logging;
public interface ActivityLogger {
void logAction(String message);
}
Затем передайте его компонентам, не относящимся к графическому интерфейсу, чтобы они не привязывались к конкретной реализации:
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 и т. Д.) И написать приложение, которое «пишет» в текстовый компонент.