Пользовательский текст Java Swing JEditorPane

У меня есть список объектов (модель), которые постоянно добавляются (аналогично файлу журнала), и я хотел бы отображать как форматированный текст в JEditorPane (представление). Как я могу склеить их вместе?

http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#document не дает достаточно информации для использования.


person Pool    schedule 13.03.2009    source источник
comment
Какие классы используются в качестве объектов (моделей)?   -  person ksuralta    schedule 13.03.2009
comment
У меня есть вектор проприетарных объектов, каждый из которых содержит строку и другую информацию. В идеале какой-то пользовательский рендерер будет стилизовать и добавлять к текстовой панели, но я не могу понять, как это связать.   -  person Pool    schedule 13.03.2009


Ответы (4)


Вы можете использовать DefaultStyledDocument вместе с AttributeSet:

SimpleAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr , true);
StyleConstants.setForeground(attr, Color.RED); 
document.insertString(document.getLenght(),"yourstring", attr))
person ordnungswidrig    schedule 13.03.2009

Одним из простых решений было бы преобразование каждого объекта в модели в HTML и добавление строк для создания документа HTML, который можно установить в JEditorPane.

person Mark    schedule 13.03.2009
comment
Да, это было бы самое простое решение, но я хотел перерисовать данные, когда пользователь хотел изменить свою цветовую схему или отфильтровать данные. Я предполагаю, что все данные могут быть повторно добавлены после любого события. - person Pool; 13.03.2009
comment
Если это так, я думаю, вам лучше использовать JTable. Было бы проще создать TableModel для ваших объектов, чем пытаться создать документ. Затем вы можете применить фильтры к своей модели таблицы и изменить настройки средства преобразования таблицы для цвета и т. д. - person Mark; 13.03.2009

Создание пользовательского Abstract Document болезненно. Вам лучше использовать промежуточную модель, которая прослушивает изменения как в вашей Object Модели, так и в документе (с DocumentListener) и обновляет либо модель, либо представление, в зависимости от. Это работает очень хорошо, если вы работаете в пользовательское время (в отличие от обновления модели Object 1000 раз в секунду).

person Mike Katz    schedule 13.03.2009
comment
Насколько я понимаю, модели для панелей редактора должны быть документами. Если вы не реализуете документ, как можно добавить вашу пользовательскую модель? - person Pool; 13.03.2009
comment
Я хотел использовать один из стандартных StyleDocuments и просто манипулировать текстом и атрибутами. - person Mike Katz; 14.03.2009

Итак, самым простым подходом было расширение JTextPane. Расширенный класс создавал базовый список и управлял им. При изменении формата (например, новые цвета) список полностью переформатирует данные. Единственная реальная проблема заключалась в том, что автопрокрутка не надежна на 100%. Оба:

Container parent = getParent();

// get the parent until scroll pane is found
while (parent != null && !(parent instanceof JScrollPane)) {
    parent = parent.getParent();
}

if (parent != null) {
    JScrollPane scrollPane = (JScrollPane)parent;
    scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());
}

и

scrollRectToVisible(new Rectangle(0, getHeight() - 2, 1, 1));

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

person Pool    schedule 19.03.2009