Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HTML-теги в JTextPane 
V
    Опции темы
nornad
Дата 13.4.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



В данный момент я пишу свой небольшой редактор HTML. Меня удивило то, что часть стилизации сделать можно легко (шрифт и его размер, например), а остальные теги не пойми как надо добавлять. Точнее, доступна стилизация от StyledEditorKit, а HTMLEditorKit почти ничего нового, похоже, не добавил.

В связи с этим вопрос: как можно по уму добавлять теги в документ и/или проставлять атрибуты выделенному тексту (как я понимаю, теги PRE, H1 и им подобные должны устанавливаться через атрибуты).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ShurikA
Дата 13.4.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 2
Всего: 3



Почему то я сейчас не нахожу, но точьно был тут очень удачный пример на эту тему.
Поройся, наверняка найдёшь ещё кучу интересных примеров.

Добавлено через 2 минуты и 48 секунд
Попробуй вот эти две ссылки:
http://www.java2s.com/Code/Java/Swing-JFC/...-EditorPane.htm
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Editor.htm


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
nornad
Дата 13.4.2007, 20:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Я вчерась там рылся и нифига найти не смог. :(
По ссылкам сейчас посмотрю. С некоторыми вещами разобрался самостоятельно, но это в основном стили от StyledEditorKit (например, выравнивание). Плюс умудрился-таки приделать вставку тэга HR. А вот что посложнее - пока никак.

Добавлено через 4 минуты и 33 секунды
Вторая ссылка не подходит. JFace от Eclipse неприемлем по двум причинам - работаю на IDEA и, что важнее, надо обойтись стандартным JDK плюс свои классы, если потребуется.

Добавлено через 8 минут и 10 секунд
Первую ссылку я вчера смотрел и сейчас на всякий глянул. Там нет (практически) редактирования. Отображение и в основном с загрузкой по урлу.

Добавлено через 11 минут и 28 секунд
HR вставляется так:
Код

                    MutableAttributeSet attr = kit.getInputAttributes();
                    attr.addAttribute(StyleConstants.NameAttribute, HTML.Tag.HR);
                    editor.getStyledDocument().insertString(editor.getCaretPosition(), " ", attr);



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ShurikA
Дата 14.4.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 2
Всего: 3



Цитата(nornad @  13.4.2007,  19:19 Найти цитируемый пост)
Добавлено через 11 минут и 28 секунд
HR вставляется так:

код Java
                    MutableAttributeSet attr = kit.getInputAttributes();
                    attr.addAttribute(StyleConstants.NameAttribute, HTML.Tag.HR);
                    editor.getStyledDocument().insertString(editor.getCaretPosition(), " ", attr);


Прикольно, спасибо что поделился smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
nornad
Дата 14.4.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Всегда пожалуйста. smile
Небольшой оффтоп: если уж начал тему и нашёл решение, то надо им поделиться, чтобы и другие могли его использовать и не начинали новых дублирующих тем.
Жаль, что пока не всё поборол. smile

Если надо, могу выложить методу вставки стилизации текста, зашитую внутрях StyledEditorKit, но по каким-то причинам не выведенную наружу для нормального пользования.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ShurikA
Дата 14.4.2007, 22:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 2
Всего: 3



Цитата(nornad @  14.4.2007,  13:43 Найти цитируемый пост)
Если надо, могу выложить методу вставки стилизации текста, зашитую внутрях StyledEditorKit, но по каким-то причинам не выведенную наружу для нормального пользования.

Буду очень благодаренsmile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
nornad
Дата 15.4.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



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


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 16.4.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



В принципе, всё довольно просто. У эдиторкитов есть встроенные классы Action'ов. Часть из них уже реализована в виде статических полей эдиторкита. Не знаю, почему, но не всем Action'ам соответствуют статичные поля. Может, на то есть веские причины, а может обычная лень разработчиков... Суть не в этом.
Кроме того, как оказывается, не для всех статичных полей Action'ов есть соответствующие им имена действий, по которым их можно идентифицировать.

Вернёмся к тому, как же всё-таки добраться до нужного нам Action'а.
У текстовых компонентов JTextPane и JEditorPane есть (у всех, кто наследует JTextComponent) метод getActions(), с помощью которого можно получить массив доступных действий. Если мы собираемся использовать множество различных действий, то имеет смысл запихать содержимое этого массива в мапу. Если нет - ищем нужный и пользуем его.

Код

private JTextPane editor;
private Map<Object, Action> actions;

// init components
{
  ...
  editor = new JTextPane();
  ...
  createActionTable(editor);
  ...
}

//The following two methods allow us to find an
//action provided by the editor kit by its name.
private void createActionTable( JTextComponent textComponent ) {
  actions = new HashMap<Object, Action>();
  Action[] actionsArray = textComponent.getActions();
  for ( Action a : actionsArray ) {
    actions.put(a.getValue(Action.NAME), a);
  }
  Action action;
  for( int i = 0; i < actionProps.length; ++i ) {
    String actionName = (String) actionProps[i++];
    Class actionClass = (Class) actionProps[i];
    try {
      action = (Action) actionClass.newInstance();
      if ( null != action ) {
        action.putValue(Action.NAME, actionName);
        actions.put(actionName, action);
      }
    }
    catch ( Exception e ) {
      e.printStackTrace();
    }
  }
}


Теперь покажем, как использовать что-либо из наших замапленных действий (на примере кнопки для тулбара):
Код

private JButton createPasteButton() {
  JButton button = new JButton("Paste", Resource.getIcon("images/paste.gif"))
  button.addActionListener(new ActionListener()
  {
    public void actionPerformed( ActionEvent e ) {
      Action action = actions.get(DefaultEditorKit.pasteAction);
      if ( null != action )
        action.actionPerformed(e);
      editor.requestFocus();
    }
  });
  return button;
}


Вместо DefaultEditorKit.pasteAction может потребоваться указать свою строковую константу, обозначающую действие (если таковая не объявлена в классе эдиторкита или недоступна снаружи). Узнать значения констант можно, если при добавлении Action'ов в мапу выводить их константы в консоль или любое другое удобное место (я, например, смотрел в дебаге на содержимое мапы). К примеру, для выравнивания по центру надо использовать константу "center-justify".

Ещё веселее ситуация, если есть класс для несольких однородных Action (например, для установки стиля шрифта (имени шрифта) или размера текста). В этом случае подобные действия в мапу не попадают. Чтобы можно было использовать эти действия, потребуется самостоятельно создать соответствующие Action'ы (хранить можно хоть отдельно, хоть в той же общей мапе - кому как удобнее). При создании потребуется указать некоторые специфичные для конкретного Action'а параметры. Пример:
Код

// font style
action = new StyledEditorKit.FontFamilyAction("FontStyle-TimesNewRoman", "Times New Roman");
// font size
action = new HTMLEditorKit.FontSizeAction("FontSize-18pt", 18);


P.S. Блин, почти на туториал тянет. smile

Добавлено через 1 минуту и 58 секунд
Ещё могу поставить тэг PRE, но это опишу уже позже (там свои заморочки).

Добавлено через 4 минуты и 37 секунд
Первый и второй примеры не мои - нарыл где-то в сети и подсмотрел. А вот до изврата (третий кусочек и тэг PRE) самому пришлось доходить.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 16.4.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Цитата(nornad @  13.4.2007,  23:19 Найти цитируемый пост)
HR вставляется так:
Код

                    MutableAttributeSet attr = kit.getInputAttributes();
                    attr.addAttribute(StyleConstants.NameAttribute, HTML.Tag.HR);
                    editor.getStyledDocument().insertString(editor.getCaretPosition(), " ", attr);

Как оказалось, этот способ имеет существенный недостаток.
Попробуйте вставить линию. Вставили? Теперь ещё раз. Ничего не видно. Теперь нажмите Enter. Снова ничего не видно. Ещё раз Enter - появилась вторая линия. А теперь самое весёлое - жмите Enter сколько влезет ;)
Жуть. Надо бы как-то исправить. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 17.4.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Так-с... с HR разобрался:
Код

kit.insertHTML(doc, editor.getSelectionStart(), "<hr>", 0, 0, HTML.Tag.HR);

Теперь будем думать над остальным.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ShurikA
Дата 17.4.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 2
Всего: 3



Цитата(nornad @  16.4.2007,  23:41 Найти цитируемый пост)
Теперь будем думать над остальным. 

А как на счёт выставлать style а не теги HTML?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
nornad
Дата 17.4.2007, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Ты имеешь в виду bold/italic или шрифт/его размер?


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ShurikA
Дата 17.4.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: 2
Всего: 3



Цитата(nornad @  17.4.2007,  04:34 Найти цитируемый пост)
шрифт/его размер

Но не size="" внутри тега font a style="font-size: 14 px".


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
nornad
Дата 17.4.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Такого я пока не умею. Но постепенно кое-что откапывается. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 17.4.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Так-с... Вот как можно поставить тэги PRE/Hn (или font style="font-size: 14 px"):
Код

                    int sels = textPane.getSelectionStart(), sele = textPane.getSelectionEnd();
                    int cpos = textPane.getCaretPosition();
                    HTMLEditorKit kit = (HTMLEditorKit) textPane.getEditorKit();
                    HTMLDocument doc = (HTMLDocument) textPane.getStyledDocument();
                    if ( sels == sele ) {
                        kit.insertHTML(
                                doc, 0 > cpos ? 0 : cpos,
                                "<H1></H1>", 0, 0, HTML.Tag.H1
                        );
                        textPane.setCaretPosition(cpos);
                    } else {
                        String html = "<H1>" + textPane.getSelectedText() + "</H1>";
                        textPane.replaceSelection("");
                        kit.insertHTML(
                                doc, sels, html,
                                0, 0, HTML.Tag.H1
                        );
                    }

Метод имеет свои недостатки, т.к. необходимо вручную определять наложение тэгов и разруливать коллизии. Хотя, я не уверен, что в официальной реализации тех же болд-италик коллизии уже разруливаются. Надо будет как-нибудь проверить.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.