Pergunta

Como faço para obter um JLabel exibindo uma string HTML apareça a cinzento (que é o comportamento de JLabels que não exibem texto HTML)? Existe outra maneira de realmente mudar a cor me modificando a propriedade 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

Muito obrigado por todas as suas respostas. Pelo que pude perceber, parece que Java não suporta automática grisalhos fora do JLabels quando eles usam texto HTML. Suraj solução tem vindo mais próximo da correção considerando as limitações.

Tenho no entanto, tentou uma abordagem diferente out-of-the box, onde eu ter colocado os JLabels texto HTML dentro de um JPanel interior e fez isso:

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

O que não funcionou. Todas as sugestões para desta forma?


EDIT: Adicionado solução implementada .

Foi útil?

Solução

Se o texto é HTML, o texto não vai ser acinzentado por causa do seguinte código no BasicLabelUI#paint()

        View v = (View) c.getClientProperty(BasicHTML.propertyKey);
        if (v != null) {
        v.paint(g, paintTextR);
        }

Como você pode ver se o texto é html, então a vista é usado para pintar e não é verificada wheter o rótulo está habilitado ou não. Assim, é preciso fazê-lo explicitamente como mostrado abaixo:

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>");
   }
  });
scroll top