当显示 HTML 文本时,JLabel 禁用时不灰显
Posted
技术标签:
【中文标题】当显示 HTML 文本时,JLabel 禁用时不灰显【英文标题】:JLabel not greyed out when disabled, when HTML text displayed 【发布时间】:2011-01-15 14:22:52 【问题描述】:如何让JLabel
显示一个显示为灰色的html 字符串(这是JLabel
s 不显示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
s 自动变灰。考虑到限制,Suraj's solution 最接近修复。
但是,我尝试了另一种开箱即用的方法,我将 HTML 文本 JLabel
s 放在内部 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 在绘制JLabel
s 时似乎明确忽略了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 禁用时不灰显的主要内容,如果未能解决你的问题,请参考以下文章