10

如何让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

非常感谢您的所有回复。据我所知,Java 似乎不支持在使JLabel​​用 HTML 文本时自动将 s 变灰。考虑到这些限制, Suraj 的解决方案最接近修复。

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

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

这没有奏效。对这种方式有什么建议吗?


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

4

5 回答 5

10

如果文本是 HTML,文本不会灰显,因为下面的代码BasicLabelUI#paint()

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

如您所见,如果文本是 html,则视图用于绘制,并且不检查标签是否启用。因此我们需要明确地做到这一点,如下所示:

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>");
   }
  });
于 2010-02-11T06:01:25.850 回答
5

实施的解决方案:

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

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

于 2010-02-12T01:24:07.040 回答
3

我建议以下内容,这是此处提供的两种解决方案的组合:

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);
    }
}
于 2011-01-18T16:20:02.813 回答
0

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

于 2010-02-11T05:52:24.540 回答
0

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

于 2010-02-11T08:44:36.800 回答