Как заставить Swing использовать мой собственный HTMLEditorKit для JLabel / JButton / etc - PullRequest
4 голосов
/ 03 ноября 2011

Допустим, я создал подкласс HTMLEditorKit (и других соответствующих классов) для отображения некоторых пользовательских тегов HTML. Я хочу иметь возможность использовать эти пользовательские теги в JLabel, JButton и так далее. Есть ли способ сделать это, кроме создания моего собственного внешнего вида? То есть я хочу сказать Swing «использовать этот экземпляр HTMLEditorKit для рендеринга HTML в JLabel / etc» независимо от того, какой внешний вид используется в данный момент. Из-за того, что я немного поковырялся во внутренностях Swing, я не думаю, что это возможно, но я бы хотел оказаться ошибочным.

Ответы [ 3 ]

3 голосов
/ 04 мая 2012

Это можно сделать:

Ключ находится в классе javax.swing.plaf.basic.BasicLabelUI, который является базовым интерфейсом для меток.

В методе рисования мы можем видеть этот код:

View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
    v.paint(g, paintTextR);
}

Класс BasicHTML является поставщиком возможностей HTML в Java, поэтому, теоретически, если вы замените свойство client на BasicHTML.propertyKey с вашей собственной реализацией View, тогда этот класс будет использоваться, и вы сможете делать все, что захотите, для визуализации текста.

Класс javax.swing.plaf.basic.BasicLabelUI является родителем большинства других пользовательских интерфейсов меток LAF, но не всех, поэтому он может работать не для всех LAF.LAF, которые не поддерживают HTML с использованием класса BasicHTML, также не будут работать с вашим исправлением.

Но ИМХО, это скорее взлом, чем функция.Вы программируете реализацию, а не интерфейс.Поэтому, если у вас нет действительно серьезных причин для этого, я бы посоветовал найти более чистый способ визуализации вашего собственного HTML-кода, такого как подкласс JLabel.

1 голос
/ 04 мая 2012

Это не может быть сделано нормально.,,Если вы расширите классы JLabel и JButton, это может быть возможно, но это похоже на большую работу для чего-то, что есть лучшие способы сделать [1].Хотя классы были бы полезны.

[1]: если текст не должен быть динамическим, попробуйте использовать изображения в JImagesIcons.

0 голосов
/ 02 апреля 2018

Пожалуйста, обратитесь к https://bugs.openjdk.java.net/browse/JDK-6540252
Репортер ошибок предлагает несколько обходных путей.

...