2016-06-29 3 views
2

Я хочу реализовать текстовый редактор в Java, где модель и вид текстовой области полностью разделены, а некоторые части текста «рассчитаны». Я просмотрел документацию и некоторые примеры набора редактора Java, Document и DocumentFilter, но я по-прежнему потерял эту тему.Реализация текстового редактора с отдельной моделью и представлениями в Java

Вкратце, что я хочу сделать, это текстовый редактор, где определенные слова, соответствующие шаблону (например: ID123456), будут заменены другим свойством объекта, на который ссылается идентификатор в соответствующем тексте. Этот обмен должен происходить только в представлении, хотя, когда текстовая область изменена или сохранена, исходный текст должен быть сохранен, а не тот, который проецируется для представления. Конечно, в этом случае проецируемый текст не может быть изменен, но с ним можно легко обращаться с помощью DocumentFilter.

пример, чтобы сделать задачу четче:

модель позади текстового редактора:

Верно ли, что ID123 имеет наибольшее производство бокситов в мире?

Нет, это неправда, ID44 имеет самое большое производство бокситов.

Что пользователь должен видеть:

Верно ли, что Бельгия имеет наибольшее производство бокситов в мире?

Нет, это неправда, Австралия имеет наибольшее производство бокситов.

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

+0

Вы ищете ['MessageFormat'] (https://docs.oracle.com/javase/8/docs/api/java/text/MessageFormat.html)? – trashgod

+0

'где модель и вид текстовой области полностью разделены. Зачем вам они нужны? Существуют и другие способы выполнения замен, сохраняя «необработанный» текст неповрежденным вне документа (например, DocumentFilter заменяет в Document и сохраняет raw (или делегирует класс, который хранит raw)) – copeg

ответ

0

Я думаю, вам нужно переопределить методы чтения/записи EditorKit и добавить свой собственный читатель и писатель (точные из них зависят от EditorKit вы расширяете).

На месте чтения идентификаторы в атрибуте символьного элемента, например. MyCustomId = ID123 и сохраните его в модели. Текст элемента должен быть фактически заменен соответствующим значением (страна в нашем случае).

Написание делают напротив. Проверьте, установлен ли в текстовом элементе атрибут MyCustomId. Если атрибут существует, напишите значение вместо текста элемента.

+0

Спасибо, это сработало отлично ! Я действительно использовал ваши [tutorials] (http://java-sl.com/editor_kit_tutorial.html), чтобы помочь мне в реализации. После реализации я нашел RSyntaxTextArea, хотя это и сделало его еще проще, очень удобным инструментом. –

0

Модель и вид -, разделенные в JTextComponent. У вас есть Документ, который является моделью, и Представления, которые отображают документ. Если вы действительно настаиваете на своем подходе, вы должны использовать JTextPane с EditorKit, где вы заменили ViewFactory одним из своих.

Однако я бы не рекомендовал этот подход. Вы не хотите изменять способ рендеринга документа. Вы просто хотите интерпретировать некоторые части документа перед его визуализацией. Так что вам нужен переводчик, который переводит ID123 в Belgium при чтении документа и Belgium в ID123 при записи.

Для этого вам необходимо сопоставить свои значения на двунаправленной карте (this one for instance). Затем вам необходимо переопределить read и write методы вашего EditorKit