Панель дополнительные текстовые журналирования Java для большого выхода

Mathematica поставляется с простой java-программой, которая позволяет проверять связь между передним концом и ядром. Это называется LinkSnooper и в целом он работает довольно хорошо. Это выглядит так

enter image description here

Я думаю, что могу улучшить поведение и удобство использования программы в некоторой степени, но для этого мне нужно переопределить некоторые части. Один фундаментальный кусок, который мне нужен, - это текстовая панель, которая имеет следующее свойства:

  • он может получать много данных, и он, вероятно, должен использовать быстрый кольцевой буфер, так что самые первые строки журнала удаляются, когда данные растут слишком много. Другая возможность заключается в том, что он автоматически начинает записывать данные на диск и, возможно, перезагружает его, когда пользователь прокручивает, чтобы увидеть первые записи
  • он должен иметь возможность обрабатывать цветной текст. Я планирую использовать простой маркер (данные журнала на самом деле являются реальным синтаксисом Mathematica) на каждом прибытие линии, чтобы сделать чтение более легким
  • он не должен быть доступен для записи. Это нормально, если текстовая панель доступна только для чтения.

вопрос: что-то подобное уже существует? В настоящее время LinkSnooper использует JTextArea внизу и перед тем, как я начну писать свою собственную версию, я хотел спросить, сделал ли кто-то это уже.

Edit:

то, что я планировал сделать, это использовать некоторую структуру Logger, потому что это кажется естественным я считаю, что эти библиотеки должны иметь возможность обрабатывать много данных. Кроме того, они часто предоставляют интерфейсы для форматирования сообщений, и можно определить различные обработчики, которые могут заботиться о различных сообщениях. Я надеялся, что кто-то уже объединил это с аккуратно работающим текстовым окном, которое может обрабатывать большой вывод.

1 ответов


как отметил Саймон, Я бы предложил использовать JavaFX для этой задачи.

Если вам "просто" нужно отображать большие объемы данных журнала без дополнительной подсветки (подсветка подстрочного диапазона),ListView является компонентом для вас.

он использует виртуализированный контейнер макета, поэтому фактически отображаются только ячейки, находящиеся в видимой области окна просмотра. Это позволяет для ленивой нагрузки, клетки рециркулируя etc. The ListView использует ObservableList как его DataStructure. Похожие на EMF EList, the ObservableListавтоматически оповестит ListView об изменениях в содержащихся в нем данных.

существует несколько заводских методов для создания ObservableList через FXCollections даже позволяя обернуть существующий List (например,RingBuffer).

Если вам нужна расширенная подсветка,RichTextFX вероятно, это решение, поскольку оно позволяет детализировать стиль его содержания текст. RichTextFX также использует виртуализированный макет.


правка #2

Том написал об этом в своем блоге: http://tomsondev.bestsolution.at/2014/12/27/displaying-and-editing-large-styled-texts/


Edit #1 ListView example

JavaFX делает очень хорошую работу по отделению модели от представления, поэтому мы стараемся не смешивать это и должны создать два вещи:

  1. класс данных (модель)
  2. A Cell рендерер для этого класса данных (смотреть).

сначала класс данных:

public class LogData {

    private final String logMessage;
    private List<String> highlightedFragments = null;

    public LogData(String pLogMessage) {
        logMessage = pLogMessage;
    }

    public String getLogMessage() {
        return logMessage;
    }

    public List<String> getHighlightedFragments() {
        if (highlightedFragments == null) {
            doHighlight();
        }
        return highlightedFragments;
    }

    private void doHighlight() {
        List<String> highlightedParts = Collections.emptyList(); // TODO lexer
        highlightedFragments = highlightedParts;
    }
}

интересная часть заключается в том, что подсветка выполняется по требованию, а не по инициализации. Или другими словами: лексер выполняет свою работу только тогда, когда визуализатор ячейки запрашивает данные.

теперь Cell рендерер:

ListView<LogData> listView = new ListView<>();
listView.setCellFactory(cb -> new LogDataCell(){});

public class LogDataCell extends ListCell<LogData>
{
    @Override
    protected void updateItem(LogData item, boolean empty) {
        super.updateItem(item, empty);

        if(empty || item == null) {
            setText(null);
            setGraphic(null);
        }
        else {
            List<String> fragments = item.getHighlightedFragments();
            if(fragments == null || fragments.isEmpty()) {
                setText(item.getLogMessage());
                setGraphic(null);
            }
            else {
                TextFlow textFlow = null; //TODO
                setText(null);
                setGraphic(textFlow);
            }
        }
    }
}

это не полностью рабочая например, осталось несколько TODOs, но, надеюсь, вы получите эту идею.

если вы хотите добавить подсветку поиска, я описал аналогичный подход для элемента управления TableView здесь:JavaFX таблица с выделенным текстом (метки) с низкой производительностью