假设我创建了HTMLEditorKit (和其他相关类)的子类,以便显示一些自定义的HTML标记。我希望能够在JLabel、JButton等中使用这些自定义标记。除了创建我自己的外观之外,还有什么方法可以做到这一点吗?也就是说,我想告诉swing“使用这个HTMLEditorKit实例在JLabel/etc中呈现HTML”,而不管当前使用的是什么外观。从我在Swing内部所做的一些探索中,我认为这是不可能的,但我希望被证明是错误的。
发布于 2012-05-04 08:08:33
可以这样做:
关键是在类javax.swing.plaf.basic.BasicLabelUI中,这是一个用于标签的基本UI。
在paint方法中,我们可以看到以下代码:
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, paintTextR);
}BasicHTML类是Java功能的提供者,因此,从理论上讲,如果您用自己的视图实现替换BasicHTML.propertyKey的客户端属性,那么将使用该类,并且您可以执行任何想要呈现文本的操作。
类javax.swing.plaf.basic.BasicLabelUI是大多数其他LAF标签UI的父类,但不是全部,因此它可能不适用于所有LAF。不支持使用BasicHTML类的超文本标记语言的LAF也不会与您的修复一起工作。
但我觉得这更像是一种黑客攻击而不是一种特性。你是在针对实现而不是接口进行编程。因此,如果您没有真正重要的理由这样做,我建议您找到一种更简洁的方法来呈现您的自定义超文本标记语言,例如JLabel子类。
发布于 2012-05-04 07:42:54
这是不能正常完成的。。。如果你扩展JLabel和JButton类,这也许是可能的,但对于一些有更好的do1方法的东西来说,这似乎是一项很大的工作。将会是有用的类。
1:如果文本不需要是动态的,可以尝试在JImagesIcons中使用图像。
发布于 2018-04-03 02:31:19
请参考https://bugs.openjdk.java.net/browse/JDK-6540252
bug报告者提出了几个变通方法。
https://stackoverflow.com/questions/7990857
复制相似问题