Java Log ==> JTextArea - PullRequest
       7

Java Log ==> JTextArea

5 голосов
/ 02 июня 2010

Необходимость: Вывести журнал приложения Java в компонент GUI, такой как JTextArea.

Озабоченность: Нужно фиксировать вещи из любого класса в статической манере. Однако компонент регистратора GUI не должен быть статичным (очевидно), поскольку он является членом родительского компонента.

Что мне делать?

Ответы [ 4 ]

2 голосов
/ 02 июня 2010

Создайте провайдера синглтон-журнала и добавьте «текстовое поле» в качестве слушателя.

Пример логгера сингелтона:

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 .

2 голосов
/ 02 июня 2010

Записать в файл, чтобы компонент следовал за хвостом файла. Возможно, вы захотите использовать XML-логи log4j, если хотите поместить вывод в сетку.

Обновление: В качестве альтернативы вы можете реализовать циклический регистратор в памяти.

1 голос
/ 14 января 2012

Следите за круговыми зависимостями между вашими классами и пакетами, вам не нужен код для спагетти.

Приложение My Swing существует из 9 модулей (контроллер, приложение, платформа, утилиты, модель, постоянство, сервис, регистратор и представление)

Вот зависимости:

view -> logger, controller, utils, model
controller -> logger, application, model, utils
application -> service, model, utils, platform
service -> persistence, model, utils
platform -> model
utils -> no dependencies
model -> no dependencies
logger -> model, utils

Требуемая зависимость от просмотра к контроллеру, но не от контроллера к просмотру.

Так что лучше всего добавить регистратор модулей и создать обработчик (который является наблюдаемым), который уведомляет наблюдателей (например, JFrame, JFace = наблюдатели).

Вид и сервисный модуль (место, где вы хотите вызвать наблюдателя) зависят не друг от друга, а через модуль логгера.

Но я думаю, что база данных работает так же. Я полагаю, кроме вас, зависит от структуры. Моего решения нет, поэтому, если я хочу перейти с Swing на swt, не беспокойтесь, я просто внедряю его для swt, и моя бизнес-логика остается неизменной.

Вы все должны думать о дизайне мудрее. (И используйте Maven.)

1 голос
/ 02 июня 2010

Связывание с данными приходит мне на ум. Вам нужна модель , которая представляет ваш журнал, и эта модель связана с компонентом GUI. Распространенной структурой привязки данных для SWT является JFace Databinding, я уверен, что для SWING существует нечто похожее.

Как это будет работать - регистратор добавляет сообщения в модель, может быть, просто Arraylist of Strings (logentries). Классы привязки данных слушают модель и обновляют графический интерфейс каждый раз, когда модель изменяется. Это будет работать и в обратном направлении (изменения в графическом интерфейсе могут быть отправлены в модель), но вам нужно только одно направление.

...