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

StackOverflow https://stackoverflow.com/questions/2242542

  •  19-09-2019
  •  | 
  •  

Вопрос

Как мне получить 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

Что не сработало.Есть какие-нибудь предложения по этому поводу?


РЕДАКТИРОВАТЬ:Добавлен реализованное решение.

Это было полезно?

Решение

Если текст 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 имущество при покраске JLabels, если он содержит текст 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top