繁体   English   中英

显示HTML文本时,JLabel在禁用时不会显示为灰色

[英]JLabel not greyed out when disabled, when HTML text displayed

如何让显示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似乎不支持在使​​用HTML文本时自动使JLabel变灰。 考虑到局限性, Suraj的解决方案最接近修复。

但是,我尝试了一种不同的开箱即用方法,我将HTML文本JLabel放在内部JPanel并执行此操作:

mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value

哪个没用。 对这种方式有什么建议吗?


编辑:添加实施的解决方案

如果文本是HTML,则由于BasicLabelUI#paint()中的以下代码,文本将不会显示为灰色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>");
   }
  });

实施解决方案:

    Color foreground = (shouldShow) ? SystemColor.textText : SystemColor.textInactiveText;
    for (Component comp : mInnerPanel.getComponents())
    {
        comp.setForeground(foreground);
    }

陷入困境并最后使用setForeground ,因为看起来Java似乎在绘制JLabel时显式忽略enabled属性,只要它包含HTML文本即可。 另请参阅@ Suraj的答案 ,了解“纯粹”的解决方案。

我建议如下,这是这里提供的两种解决方案的组合:

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);
    }
}

您可以在HTML中指定字体颜色。

覆盖UI中的paint方法,如果禁用了客户端属性BasicHTML.propertyKey ,则将其设置为null并调用super ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM