当显示 HTML 文本时,JLabel 禁用时不灰显

Posted

技术标签:

【中文标题】当显示 HTML 文本时,JLabel 禁用时不灰显【英文标题】:JLabel not greyed out when disabled, when HTML text displayed 【发布时间】:2011-01-15 14:22:52 【问题描述】:

如何让JLabel 显示一个显示为灰色的html 字符串(这是JLabels 不显示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 文本时似乎不支持 JLabels 自动变灰。考虑到限制,Suraj's solution 最接近修复。

但是,我尝试了另一种开箱即用的方法,我将 HTML 文本 JLabels 放在内部 JPanel 中,然后这样做:

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

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


编辑:添加implemented solution。

【问题讨论】:

你应该编辑你的原始问题而不是发布另一个问题 @Lombo,我的错,我没有意识到 - 现在删除了前一个。 这似乎已在 Java 1.7 中修复。 @SystemParadox 感谢您告知我们! 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

实施的解决方案:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

@sreejith...显然它不起作用,有两个原因 a) 如果您将 BasicHTML.propertyKey 设置为 null 那么任何使用 html 呈现的组件都将无法绘制 html b) 尽管文本将是显示为灰色,它将显示条目 html,即它将显示“HTML text”而不是 HTML 文本。 :)【参考方案4】:

如果文本是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>");
   
  );

【讨论】:

setForeground 有效,所以我建议使用它而不是更改标签文本来更改颜色。 就我而言,更改 HTML 可能不是一个好习惯。【参考方案5】:

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

【讨论】:

@camickr:所以每次启用/禁用状态更改时我都必须这样做? 是的,这就是为什么使用 setForeground() 方法仍然是最简单的解决方案。

以上是关于当显示 HTML 文本时,JLabel 禁用时不灰显的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 JLabel 的自动 HTML 支持?

组布局中的 JLabel - 冻结大小

JLabel 保留以前的文本

html文本框和按钮这些点击时不显示边框的光晕。 或者淡化好看些。

如何设置 JLabel 文本在系统睡眠前显示

为啥我的 UITextView 文本从开始时不显示并隐藏在导航栏下