Как заставить Swing использовать мой собственный HTMLEditorKit для JLabel/JButton/etc
Допустим, я сделал подкласс HTMLEditorKit
(и другие соответствующие классы) для отображения некоторых пользовательских тегов HTML. Я хочу иметь возможность использовать эти пользовательские теги в JLabel
, JButton
, и так далее. Есть ли способ сделать это, кроме создания моего собственного внешнего вида? То есть я хочу сказать свинг "использовать этот экземпляр HTMLEditorKit
для рендеринга HTML в JLabel
/etc", независимо от того, какой внешний вид используется в настоящее время. Из того, как я немного поковырялся во внутренностях Swing, я не думаю, что это возможно, но я бы хотел оказаться ошибочным.
3 ответа
Это можно сделать:
Ключ находится в классе 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.
Это не может быть сделано нормально.,, Если вы продлите JLabel
а также JButton
классы, это может быть возможно, но это кажется большой работой для чего-то, что есть лучшие способы сделать [1]. Было бы полезно, хотя классы.
[1]: если текст не должен быть динамическим, попробуйте использовать изображения в JImagesIcons
,
Пожалуйста, обратитесь к https://bugs.openjdk.java.net/browse/JDK-6540252
Репортер ошибок предлагает несколько обходных путей.