如何让 Swing 使用我自己的 HTMLEditorKit for JLabel/JButton/etc

Mat*_*ine 5 html java swing htmleditorkit

假设我已经创建了HTMLEditorKit(和其他相关类)的子类以显示一些自定义 HTML 标签。我希望能够在对使用这些自定义标签JLabelJButton等。除了创建我自己的外观之外,还有什么方法可以做到这一点吗?也就是说,我想告诉swing“使用此实例HTMLEditorKitJLabel/etc 中呈现HTML ”,而不管当前正在使用什么外观。从我在 Swing 内部所做的一点点探索来看,我认为这是不可能的,但我很想被证明是错误的。

Jak*_*rka 4

可以办到:

关键在类中javax.swing.plaf.basic.BasicLabelUI,它是标签的基本 UI。

在paint方法中,我们可以看到这样的代码:

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

BasicHTML 类是 Java 中 HTML 功能的提供者,因此,理论上,如果您将 client 属性替换为BasicHTML.propertyKey您自己的 View 实现,那么将使用该类,并且您可以执行任何您想要呈现文本的操作。

该类javax.swing.plaf.basic.BasicLabelUI是大多数其他 LAF 标签 UI 的父级,但不是全部,因此它可能不适用于所有 LAF。不支持使用该类的 HTML 的 LAFBasicHTML也不适用于您的修复。

但恕我直言,这更多的是一种黑客行为而不是功能。您正在针对实现而不是接口进行编程。因此,如果您没有真正的理由这样做,我建议您找到一种更简洁的方法来呈现自定义 HTML,例如 JLabel 子类。