JLabel não acinzentado quando desativado, quando o texto HTML exibido
-
19-09-2019 - |
Pergunta
Como faço para obter um JLabel
exibindo uma string HTML apareça a cinzento (que é o comportamento de JLabel
s 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 JLabel
s 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 JLabel
s 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 .
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>");
}
});
Outras dicas
solução implementada:
Color foreground = (shouldShow) ? SystemColor.textText : SystemColor.textInactiveText;
for (Component comp : mInnerPanel.getComponents())
{
comp.setForeground(foreground);
}
cedeu e setForeground
usado no final, como parece que Java parece ignorar explicitamente a propriedade enabled
ao pintar JLabel
s desde que contém texto HTML. Veja também @ de Suraj resposta ??a >, para solução "puro".
Gostaria de sugerir o seguinte, que é a combinação de duas soluções fornecidas aqui:
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);
}
}
Você pode especificar a cor da fonte no HTML.
Substitua o método de pintura na UI, defina a propriedade cliente BasicHTML.propertyKey para null se ele está desativado e chamar de super ...