2010-02-11 8 views
9

¿Cómo obtengo un JLabel mostrando una cadena HTML que aparece atenuada (que es el comportamiento de JLabel que no muestra texto HTML)? ¿Hay otra forma de cambiar el color yo mismo modificando la propiedad foreground?JLabel no aparece atenuada cuando está deshabilitada, cuando se muestra texto HTML

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 

Muchas gracias por todas sus respuestas. Por lo que veo, parece que Java no es compatible con el desvanecimiento automático de JLabel s cuando utilizan texto HTML. Suraj's solution se ha acercado más al arreglo teniendo en cuenta las limitaciones.

he sin embargo, un tratado fuera de la caja de enfoque, donde he puesto el texto HTML JLabel s dentro de un interior JPanel e hizo esto diferente:

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

que no ha funcionado. Alguna sugerencia para esta manera?


EDITAR: Agregado implemented solution.

+0

debería editar su pregunta original no fijar otro – Lombo

+0

@Lombo, mi mal, no me di cuenta - eliminado el el anterior ahora. – bguiz

+0

Esto parece estar arreglado en Java 1.7. – SystemParadox

Respuesta

10

Si el texto es HTML, el texto no será atenuados debido al código siguiente en BasicLabelUI#paint()

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

Como se puede ver si el texto es HTML, entonces la vista se utiliza para pintar y no es marcada si la etiqueta está habilitada o no. Por lo tanto tenemos que hacerlo explicitamente como se muestra a continuación:

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>"); 
    } 
    }); 
+1

'setForeground' funciona, por lo que sugeriría usar eso en lugar de alterar el texto de la etiqueta para cambiar el color. – lins314159

+0

Sin embargo, cambiar HTML puede no ser una buena práctica en lo que a mí respecta. – user12458

0

Puede especificar el color de la fuente en el HTML.

+0

@camickr: ¿Tendría que hacer esto cada vez que cambie el estado habilitado/deshabilitado? – bguiz

+0

Sí, por lo que utilizar el método setForeground() sigue siendo la solución más fácil. – camickr

0

reemplazar el método de pintura en la interfaz de usuario, establezca la propiedad del cliente BasicHTML.propertyKey en nulo si está desactivado y llame súper ...

+1

@sreejith ... aparentemente no funcionará, por dos razones a) si configura BasicHTML.propertyKey para anular, entonces cualquier componente que utilice la representación html no podrá pintar html b) aunque el texto se mostrará en gris, mostrará la entrada html, es decir, mostrará " HTML texto" en lugar de texto HTML. :) –

4

solución implementada:

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

cedió y se utiliza setForeground al final, ya que parece que Java parece ignorar explícitamente la propiedad enabled cuando p Ainting JLabel s siempre que contenga texto HTML. Consulte también @Suraj's answer, para la solución "pura".

2

Yo sugeriría lo siguiente, que es la combinación de dos soluciones proporcionada aquí:

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