| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > HTML-теги в JTextPane |
| Автор: nornad 13.4.2007, 11:38 |
| В данный момент я пишу свой небольшой редактор HTML. Меня удивило то, что часть стилизации сделать можно легко (шрифт и его размер, например), а остальные теги не пойми как надо добавлять. Точнее, доступна стилизация от StyledEditorKit, а HTMLEditorKit почти ничего нового, похоже, не добавил. В связи с этим вопрос: как можно по уму добавлять теги в документ и/или проставлять атрибуты выделенному тексту (как я понимаю, теги PRE, H1 и им подобные должны устанавливаться через атрибуты). |
| Автор: ShurikA 13.4.2007, 19:28 |
| Почему то я сейчас не нахожу, но точьно был http://www.java2s.com/Code/Java/CatalogJava.htm очень удачный пример на эту тему. Поройся, наверняка найдёшь ещё кучу интересных примеров. Добавлено через 2 минуты и 48 секунд Попробуй вот эти две ссылки: http://www.java2s.com/Code/Java/Swing-JFC/Text-EditorPane.htm http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Editor.htm |
| Автор: nornad 13.4.2007, 20:19 | ||
| Я вчерась там рылся и нифига найти не смог. :( По ссылкам сейчас посмотрю. С некоторыми вещами разобрался самостоятельно, но это в основном стили от StyledEditorKit (например, выравнивание). Плюс умудрился-таки приделать вставку тэга HR. А вот что посложнее - пока никак. Добавлено через 4 минуты и 33 секунды Вторая ссылка не подходит. JFace от Eclipse неприемлем по двум причинам - работаю на IDEA и, что важнее, надо обойтись стандартным JDK плюс свои классы, если потребуется. Добавлено через 8 минут и 10 секунд Первую ссылку я вчера смотрел и сейчас на всякий глянул. Там нет (практически) редактирования. Отображение и в основном с загрузкой по урлу. Добавлено через 11 минут и 28 секунд HR вставляется так:
|
| Автор: nornad 14.4.2007, 14:43 |
| Всегда пожалуйста. Небольшой оффтоп: если уж начал тему и нашёл решение, то надо им поделиться, чтобы и другие могли его использовать и не начинали новых дублирующих тем. Жаль, что пока не всё поборол. Если надо, могу выложить методу вставки стилизации текста, зашитую внутрях StyledEditorKit, но по каким-то причинам не выведенную наружу для нормального пользования. |
| Автор: ShurikA 14.4.2007, 22:27 | ||
Буду очень благодарен |
| Автор: nornad 15.4.2007, 08:55 |
| Без проблем, только немного позже (я систему переставил и сейчас ставлю и настраиваю весь софт). Думаю, или сегодня вечером, или завтра выложу описание и пример кода. |
| Автор: nornad 16.4.2007, 00:05 | ||||||
| В принципе, всё довольно просто. У эдиторкитов есть встроенные классы Action'ов. Часть из них уже реализована в виде статических полей эдиторкита. Не знаю, почему, но не всем Action'ам соответствуют статичные поля. Может, на то есть веские причины, а может обычная лень разработчиков... Суть не в этом. Кроме того, как оказывается, не для всех статичных полей Action'ов есть соответствующие им имена действий, по которым их можно идентифицировать. Вернёмся к тому, как же всё-таки добраться до нужного нам Action'а. У текстовых компонентов JTextPane и JEditorPane есть (у всех, кто наследует JTextComponent) метод getActions(), с помощью которого можно получить массив доступных действий. Если мы собираемся использовать множество различных действий, то имеет смысл запихать содержимое этого массива в мапу. Если нет - ищем нужный и пользуем его.
Теперь покажем, как использовать что-либо из наших замапленных действий (на примере кнопки для тулбара):
Вместо DefaultEditorKit.pasteAction может потребоваться указать свою строковую константу, обозначающую действие (если таковая не объявлена в классе эдиторкита или недоступна снаружи). Узнать значения констант можно, если при добавлении Action'ов в мапу выводить их константы в консоль или любое другое удобное место (я, например, смотрел в дебаге на содержимое мапы). К примеру, для выравнивания по центру надо использовать константу "center-justify". Ещё веселее ситуация, если есть класс для несольких однородных Action (например, для установки стиля шрифта (имени шрифта) или размера текста). В этом случае подобные действия в мапу не попадают. Чтобы можно было использовать эти действия, потребуется самостоятельно создать соответствующие Action'ы (хранить можно хоть отдельно, хоть в той же общей мапе - кому как удобнее). При создании потребуется указать некоторые специфичные для конкретного Action'а параметры. Пример:
P.S. Блин, почти на туториал тянет. Добавлено через 1 минуту и 58 секунд Ещё могу поставить тэг PRE, но это опишу уже позже (там свои заморочки). Добавлено через 4 минуты и 37 секунд Первый и второй примеры не мои - нарыл где-то в сети и подсмотрел. А вот до изврата (третий кусочек и тэг PRE) самому пришлось доходить. |
| Автор: nornad 16.4.2007, 21:02 | ||||
Как оказалось, этот способ имеет существенный недостаток. Попробуйте вставить линию. Вставили? Теперь ещё раз. Ничего не видно. Теперь нажмите Enter. Снова ничего не видно. Ещё раз Enter - появилась вторая линия. А теперь самое весёлое - жмите Enter сколько влезет ;) Жуть. Надо бы как-то исправить. |
| Автор: nornad 17.4.2007, 00:41 | ||
Так-с... с HR разобрался:
Теперь будем думать над остальным. |
| Автор: ShurikA 17.4.2007, 01:02 |
А как на счёт выставлать style а не теги HTML? |
| Автор: nornad 17.4.2007, 05:34 |
| Ты имеешь в виду bold/italic или шрифт/его размер? |
| Автор: ShurikA 17.4.2007, 12:25 |
Но не size="" внутри тега font a style="font-size: 14 px". |
| Автор: nornad 17.4.2007, 16:15 |
| Такого я пока не умею. Но постепенно кое-что откапывается. |
| Автор: nornad 17.4.2007, 21:10 | ||
Так-с... Вот как можно поставить тэги PRE/Hn (или font style="font-size: 14 px"):
Метод имеет свои недостатки, т.к. необходимо вручную определять наложение тэгов и разруливать коллизии. Хотя, я не уверен, что в официальной реализации тех же болд-италик коллизии уже разруливаются. Надо будет как-нибудь проверить. |
| Автор: malah 17.4.2007, 21:49 |
| Я вас приветствую! Прочитал тему и заинтересовался, ведь скоро самому бакалавра сдавать, суть похожа, но конь не валялся Есть вот такая статейка http://forum.vingrad.ru/act-Attach/type/post/id-318133.html . А вот у меня какой вопрос: редактору передается HTML код, но не простой.... а именно в нем есть не простой тег(специальная конструкция), который запрещает редактировать текст внутри себя. Т.Е. необходимо чтобы этот текст отображался в JTextPane, но его нельзя было изменять, а все остальное можно... Кроме этого требуется ввести свой атрибут, с той же целью, но чтоб его можно было добавлять в обычные теги. Как сделать ума не приложу, может кто сможет мне помочь... С JAVA пока очень слабо знаком, читать в инсте будут только осенью :( |
| Автор: nornad 18.4.2007, 00:07 |
| На форумах на Sun'е я находил что-то про то, как добавить парсеру свой тэг. Я там до сих пор копаюсь, так что ежели снова увижу - дам ссылку. Суть теории - сделать объект своего тэга на основе неизвестного, добавить в парсер и зарегистрировать его там. Насчёт перехвата обработки тэга не скажу, но возможность должна быть. P.S. Вообще у меня сложилось впечатление, что визуальный редактор HTML на жабе делать почти никто не умеет. Ну практически совершенно нет в сети информации. Добавлено через 2 минуты и 2 секунды На бакалавра сдавать в конце будущего учебного года? Время, в принципе достаточно, чтобы нормально разобраться. |
| Автор: malah 18.4.2007, 06:56 | ||
Если бы, десятого мая (ЭТОГО ГОДА) нужно сдать в деканат тему и план... |
| Автор: nornad 18.4.2007, 13:14 |
| malah, посмотри http://forum.java.sun.com/thread.jspa?forumID=257&threadID=500275 - что-то про нестандратные тэги. |
| Автор: nornad 19.4.2007, 02:32 | ||||
| Два способа вставки гиперссылки: 1. используя insertHTML()
2. используя механизм стандартных тэгов эдиторкита (предпочтительнее)
P.S. Не сочтите гиперссылки за рекламу - просто я у себя тестил так, а придумывать что-то другое лень. |
| Автор: nornad 24.4.2007, 02:26 |
| Пока что не могу победить закавыку с добавлением гиперссылки (или другого тэга со схожей структурой). Заключается закавыка в том, что если перед добавлением курсор стоял в конце документа, то после добавления тэга не получается написать ничего за ним. Всё, что будете вводить, будет добавляться внутрь этого тэга. А вот как выйти за его пределы?.. Кстати, при добавлении списков схожая проблема - новый текст будет добавляться в первый и единственный элемент списка. Сейчас пытаюсь сделать так, чтобы по нажатию Enter добавлялся новый элемент списка, но потом будет проблема определения, надо ли завершить список. И снова вернёмся к проблеме выхода за пределы последнего тэга. В общем, как-то странно Сановцы реализовали эту поделку... То ли они хтмл не любят, то ли лень им было нормально всё сделать... |
| Автор: nornad 25.4.2007, 03:00 | ||
| С установкой фона в редакторе интересная история. Можно, конечно, утсановить с помощью setBackground(), но тогда цвет установится у компонента, а не в хтмле. Попытки установить при помощи задания атрибутов ни к чему хорошему не приводят - либо не ставится, либо внутрь body вставляется параграф, содержащий ещё один body, у которого и будет проставлен цвет фона. Сегодня нашёл на форумах Sun вариант установки фона через внутренности документа. Фон устанавливается прекрасно. Одна проблема - "отваливается" остальное, например, отображение списков. В конце концов, я решил проблему радикально при помощи топора, зубила и напильника:
|
| Автор: nornad 26.4.2007, 03:37 | ||||||||
| Сегодня я расскажу, как работать с ненумерованными списками. Вот как можно добавить список в редактор:
bulAction нужен для того, чтобы вставлять список на уровне тэга BODY, а ulAction - на уровне тэга LI (чтобы была возможность делать вложенные списки). Если вам потребуется иметь возможность вставлять списки в другие тэги (например, в P), то потребуются соответствующие экшены. Вообще, на мой взгляд, реализовали сановцы это дело довольно отвратно. Идея, может быть, изначально и была великолепной, но вот реализация... Если вы ещё не догадались о чём, я - поясню. Допустим, у нас есть хтмл вида
и мы желаем вставить список в текущую позицию, которая соответствует пробелу внутри тэга Р. Используем "стандартный" вариант экшена с указанием в качестве родительского тэга BODY. И что же мы получаем? Вот что:
Несколько неожиданно, не правда ли? Но это ещё не всё. Мало просто добавить список в JTextPane. Для того, чтобы по нажатию Enter добавлялся новый элемент списка ("умолчальное" поведение сановской поделки - перевод строки), надо отлавливать нажатие клавиши, проверять, где мы находимся (в каком тэге) и производить магические пассы. Вот пример, который приближает работу списка к том, что мы привыкли видеть в большинстве редакторов:
|
| Автор: nornad 28.4.2007, 03:14 |
| С отступами нашёл способ через стиль атрибута, но есть загвоздка - работает это дело на уровне стилей текста в компоненте, а в хтмл не попадает. Если у кого-нибудь есть идеи, как сделать нормально - милости просим. Я пытался делать через хтмл-атрибут style, но ничего не вышло - компонент просто проигнорировал установку атрибута. |
| Автор: nornad 30.4.2007, 02:46 | ||
Вот код для организации отступов. Жаль, что нормального способа (чтобы он отражался в хтмле) я пока не нашёл.
Добавлено через 3 минуты и 58 секунд Думаю, на этом пока и закончу. Вопрос помечу решённым, т.к., в принципе, основные цели достигнуты. |
| Автор: jecl 19.3.2008, 19:06 |
| Привет! Есть такой вопрос. Как сказать JTextPane игнорировать незнакомые теги? Например, сохранил я из опен офиса свой дукумент в хтмл, и пытаюсь отобрахить его в JTextPane. При запуске машина пишит и ничего не выводится. А загвоздка в теге типа <META HTTP-EQUIV='CONTENT-TYPE' CONTENT='text/html; charset=utf-8'>. После их удаления, все ок. спс. |
| Автор: filipp76 22.3.2008, 12:45 |
| Меня интересует добавление гиперссылок, использовал первый метод из двух предложенных, все хорошо но при клике на гиперссылку ничего не открываеться )), как сделать чтоб ссылка открывалась в браузере по умолчанию? (Сафари, Опера и т.д.) |