如何让显示HTML字符串的JLabel
显示为灰色(这是JLabel
不显示HTML文本的行为?还有其他方法,而不是通过修改foreground
属性来实际改变颜色吗?
JLabel label1 = new JLabel("Normal text");
JLabel label2 = new JLabel("<html>HTML <b>text</b>");
// Both labels are now black in colour
label1.setEnabled(false);
label2.setEnabled(false);
// label1 is greyed out, label2 is still black in colour
非常感谢您的所有回复。从我收集的内容来看,Java似乎不支持在JLabel
使用HTML文本时自动变灰。考虑到局限性,Suraj's solution最接近修复。
然而,我尝试了一种不同的开箱即用方法,我将HTML文本JLabel
置于内部JPanel
内并执行此操作:
mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value
哪个没用。对此有何建议?
编辑:已添加implemented solution。
答案 0 :(得分:10)
如果文字是HTML,由于BasicLabelUI#paint()
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, paintTextR);
}
正如您可以看到文本是否为html,然后使用View进行绘制,并且不会检查标签是否已启用。 因此,我们需要明确地做到这一点,如下所示:
label2.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (!evt.getPropertyName().equals("enabled"))
return;
if (evt.getNewValue().equals(Boolean.FALSE))
label2.setText("<html><font color=gray>HTML <b>text</b></html>");
else
label2.setText("<html><font color=black>HTML <b>text</b></html>");
}
});
答案 1 :(得分:4)
已实施解决方案:
Color foreground = (shouldShow) ? SystemColor.textText : SystemColor.textInactiveText;
for (Component comp : mInnerPanel.getComponents())
{
comp.setForeground(foreground);
}
最后陷入并使用setForeground
,因为看起来Java似乎在绘制enabled
时显式忽略JLabel
属性,只要它包含HTML文本即可。另请参阅@Suraj's answer,了解“纯粹”解决方案。
答案 2 :(得分:2)
我建议如下,这是这里提供的两种解决方案的组合:
public class HtmlLabel extends JLabel{
public void setEnabled(boolean enabled){
if(getClientProperty(BasicHTML.propertyKey) != null ){
Color foreground = (enabled) ? SystemColor.textText : SystemColor.textInactiveText;
setForeground(foreground);
}
super.setEnabled(enabled);
}
}
答案 3 :(得分:0)
您可以在HTML中指定字体颜色。
答案 4 :(得分:0)
覆盖UI中的paint方法,如果禁用了客户端属性 BasicHTML.propertyKey ,则将其设置为null并调用super ...