Как реализовать DocumentFilter, который вставляет URL-адреса в виде гиперссылок в JTextPane?

У меня есть JTable, который использует JTextPane в качестве редактора и рендерера. Я добавил в редактор keyListener, который прослушивает символ «пробел» и проверяет, является ли последнее слово URL-адресом, и если это так, добавляет его в редактор как гиперссылку, используя этот атрибут: attrs.addAttribute(HTML.Attribute.HREF, url);. Вскоре я понял, что это не будет преобразовывать URL-адреса в гиперссылки при вставке текста, поэтому я решил, что мне нужно сделать это с помощью DocumentFilter.

Как я могу создать DocumentFilter, который проверяет, содержит ли текст, который должен быть вставлен/заменен, URL-адреса, и если он вставляет/заменяет эти URL-адреса атрибутом HTML.Attribute.HREF, а остальную часть текста как есть?


person Igor    schedule 28.10.2012    source источник


Ответы (2)


См. пример http://java-sl.com/tip_autocreate_links.html Не обязательно использовать фильтр документов. LIstener достаточно.

Просто отметьте вставленный контент фиктивным атрибутом, а затем замените его гиперссылкой html.

person StanislavL    schedule 29.10.2012
comment
У меня уже есть что-то похожее на это, которое прослушивает и \n, но это не сработает, если вы вставите текст, поэтому мне нужен документфильтр. - person Igor; 29.10.2012
comment
Реализуйте один единственный метод для проверки диапазона текста между двумя смещениями. При вставке текста также вызывается DocumentListener (может быть несколько раз). Передайте смещения от событий в метод и обработайте измененный фрагмент. - person StanislavL; 29.10.2012
comment
хм.. интересно. Хотя: разве мы не ожидаем проблем при изменении уведомляющего документа в DocumentListener? Как и в общем правиле: никогда не изменять состояние вызывающей стороны в методе обратного вызова. Всегда думал, что DocumentFilter - это (единственный) безопасный способ обойти эти ... - person kleopatra; 29.10.2012
comment
@kleopatra Я согласен. Именно поэтому я настаиваю на использовании DocumentFilter. У вас есть ссылка на реализацию DocumentFilter для этой цели? - person Igor; 29.10.2012
comment
@ Игорь нет, но я бы просто (хотя и не пытался) взять код стани и переместить его в фильтр - person kleopatra; 29.10.2012
comment
@kleopatra просто вызовите код в DocumentListener, обернув SwingUtilities.invokeLater - person StanislavL; 29.10.2012

person    schedule
comment
Я не знаю, смогу ли я уточнить свой вопрос, но мне нужно создать файл DocumentListener. Другие части, которые открывают ссылки и преобразуют курсор по умолчанию в курсор в виде руки, уже выполнены. Пожалуйста, удалите этот ответ, так как он не соответствует моему вопросу. - person Igor; 29.10.2012
comment
тогда почему бы вам не использовать HTMLEditorKit, там также существует класс HTMLEditorKit.LinkController. - person s.s.o; 29.10.2012
comment
Это прослушиватель мыши, который прослушивает щелчки мыши по гиперссылкам, которые уже добавлены. Я хочу, чтобы приложение преобразовывало URL-адреса в гиперссылки по мере ввода. - person Igor; 29.10.2012