JLabel не выделяется серым цветом при отключении, когда отображается текст HTML


Как заставить 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 не поддерживает автоматическое поседение из JLabels, когда они используют HTML-текст. решение Сураджа подошло ближе всего к решению, рассматривая ограничения.

Я, однако, попробовал другой подход из коробки, где я поместил HTML-текст JLabelвнутри внутреннего JPanel и сделал это:

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

Который не сработал. Есть предложения по этому пути?


EDIT: добавленореализованное решение .

5 9

5 ответов:

Если текст 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>");
   }
  });

Реализованное решение:

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

Уступил и использовал setForeground в конце концов, поскольку кажется, что Java явно игнорирует свойство enabled при рисовании JLabel s, пока оно содержит текст HTML. См. также ответы@Сурадж по, для "чистого" решения.

Я бы предложил следующее, которое является комбинацией двух решений, представленных здесь:

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

Вы можете указать цвет шрифта в HTML.

Переопределите метод paint в пользовательском интерфейсе, задайте свойство клиента BasicHTML.propertyKey для null, если он отключен и вызывает super...