Потребность: Произведите JAVA-приложение, входят в компонент графического интерфейса пользователя, такой как JTextArea.
Беспокойство: Должен зарегистрировать вещи от любого класса, статическим способом. Однако компонент регистратора GUI не должен быть статичным (очевидно), поскольку это - член родительского компонента.
Что мне делать?
Создайте поставщика журнала singleton и добавьте к нему «текстовое поле» в качестве слушателя.
Пример синглтона регистратора:
interface Listener {
void log(String log);
}
enum Logger {
instance;
private List<Listener> listeners = new LinkedList<Listener>();
public void addListener(Listener l) {
synchronized(listeners) {
listeners.add(l);
}
}
public void log(String log) {
synchronized(listeners) {
for(Listener l : listeners)
l.log(log);
}
}
}
Добавьте свой слушатель (который вам нужно будет реализовать самостоятельно) следующим образом:
Logger.instance.addListener(myTextField);
И используйте его (из любого класса) следующим образом:
Logger.instance.log("Hello World!");
Или вы можете использовать пакет например log4j .
Записаться в файл, чтобы компонент следовал за концом файла. Вы, вероятно, захотите использовать ведение журнала XML log4j, если хотите поместить вывод в сетку.
Обновление: Вы также можете реализовать циклический регистратор в памяти.
Мне приходит в голову привязка данных. Вам нужна модель , представляющая ваш журнал, и эта модель привязана к компоненту графического интерфейса. Распространенной структурой привязки данных для SWT является привязка данных JFace, я уверен, что для SWING существует нечто похожее.
Как бы это работало - регистратор добавляет сообщения в модель, возможно, просто Arraylist of Strings (logentries). Классы привязки данных слушают модель и обновляют графический интерфейс каждый раз при изменении модели. Это будет работать и в обратном направлении (изменения в графическом интерфейсе могут быть отправлены в модель), но вам просто нужно одно направление.