假设我已经制作了HTMLEditorKit
(和其他相关类)的子类,以显示一些自定义 HTML 标记。我希望能够在 、 等中使用这些自定义JLabel
标签JButton
。除了创建自己的外观和感觉之外,还有什么方法可以做到这一点?也就是说,我想告诉 swing“使用这个实例HTMLEditorKit
在 /etc 中呈现 HTML JLabel
”,而不管当前使用的是什么外观。从我在 Swing internals 中所做的小调查来看,我认为这是不可能的,但我很想被证明是错误的。
3 回答
可以办到:
关键在于 class javax.swing.plaf.basic.BasicLabelUI
,这是标签的基本 UI。
在paint方法中,我们可以看到这段代码:
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, paintTextR);
}
BasicHTML 类是 Java 中 HTML 功能的提供者,因此,理论上,如果您将 client 属性替换为BasicHTML.propertyKey
您自己的 View 实现,那么将使用该类,您可以执行任何您想要呈现文本的操作。
该类javax.swing.plaf.basic.BasicLabelUI
是大多数其他 LAF 标签 UI 的父类,但不是全部,因此它可能不适用于所有 LAF。不支持使用BasicHTML
该类的 HTML 的 LAF 也不适用于您的修复。
但恕我直言,这更像是一种黑客行为而不是功能。您正在编程反对实现,而不是接口。因此,如果您没有真正的理由这样做,我建议您找到一种更简洁的方法来呈现您的自定义 HTML,例如 JLabel 子类。
不能正常进行。. . 如果你扩展JLabel
和JButton
类,这可能是可能的,但这些似乎需要做很多工作,因为有更好的方法可以做[1]。不过会是有用的课程。
[1]:如果文本不需要是动态的,请尝试在JImagesIcons
.
请参考https://bugs.openjdk.java.net/browse/JDK-6540252
错误报告者提出了几种解决方法。