【问题标题】:JLabel not greyed out when disabled, when HTML text displayed当显示 HTML 文本时,JLabel 禁用时不灰显
【发布时间】: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 感谢您告知我们!

标签: java swing jlabel appearance


【解决方案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() 方法仍然是最简单的解决方案。
      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2013-04-27
      • 2017-07-11
      • 2019-07-27
      相关资源
      最近更新 更多