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

bgu*_*uiz 9 java swing appearance jlabel

如何JLabel显示一个显示为灰色的HTML字符串(这是JLabel不显示HTML文本的s 的行为)?还有另外一种方法,而不是通过修改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
Run Code Online (Sandbox Code Playgroud)

非常感谢您的所有回复.从我收集的内容来看,似乎Java JLabel在使用HTML文本时不支持自动灰显.考虑到局限性,Suraj的解决方案最接近修复.

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

mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value
Run Code Online (Sandbox Code Playgroud)

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


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

Sur*_*ran 10

如果文本是HTML,则由于以下代码,文本将不会显示为灰色 BasicLabelUI#paint()

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

正如您可以看到文本是否为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>");
   }
  });
Run Code Online (Sandbox Code Playgroud)


bgu*_*uiz 5

实施的解决方案:

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

最后陷入困境并使用setForeground,因为只要它包含 HTML 文本,Java 似乎enabled在绘制JLabels时似乎明确忽略该属性。另请参阅@Suraj 的回答,了解“纯”解决方案。