Question

Comment puis-je obtenir un JLabel afficher une chaîne HTML apparoistre grisés (ce qui est le comportement de JLabels qui ne présentent pas de texte HTML)? Y at-il une autre façon que de changer réellement moi-même couleur en modifiant la propriété 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

Merci beaucoup pour toutes vos réponses. D'après ce que je comprends, il semble que Java ne supporte pas le grisonnement automatique de JLabels quand ils utilisent du texte HTML. La solution Suraj est venu le plus proche de la solution tenant compte des limites.

Je l'ai cependant essayé un autre hors l'approche de la boîte, où je les ai mis JLabels texte HTML à l'intérieur d'un JPanel intérieur et a fait ceci:

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

Ce qui n'a pas fonctionné. Toutes les suggestions de cette façon?


EDIT: Ajout .

Était-ce utile?

La solution

Si le texte est HTML, le texte ne sera pas en grisé en raison du code suivant dans BasicLabelUI#paint()

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

Comme vous pouvez le voir si le texte est html, la vue est utilisé pour la peinture et il n'est pas cochée wheter l'étiquette est activée ou non. Par conséquent, nous devons le faire explictly comme indiqué ci-dessous:

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

Autres conseils

solution mise en œuvre:

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

Enterrés et utilisé setForeground à la fin, car il semble que Java semble ignorer explicitement la propriété enabled lors de la peinture JLabels tant qu'elle contient du texte HTML. Voir aussi @ réponse de Suraj , pour la solution "pure".

Je suggère ce qui suit, qui est une combinaison de deux solutions fournies ici:

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

Vous pouvez spécifier la couleur de la police dans le code HTML.

surchargent la méthode de peinture dans l'interface utilisateur, définissez la propriété client BasicHTML.propertyKey null si elle est désactivée et appeler super ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top