JLabel не отображается серым цветом при отключении, когда отображается текст HTML - PullRequest
9 голосов
/ 11 февраля 2010

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

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

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

Что не сработало. Любые предложения по этому пути?


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

Ответы [ 5 ]

10 голосов
/ 11 февраля 2010

Если текст является 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>");
   }
  });
4 голосов
/ 12 февраля 2010

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

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

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

2 голосов
/ 18 января 2011

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

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);
    }
}
0 голосов
/ 11 февраля 2010

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

0 голосов
/ 11 февраля 2010

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

...