JLabel non grisées quand il est désactivé, lorsque le texte HTML affiché
-
19-09-2019 - |
Question
Comment puis-je obtenir un JLabel
afficher une chaîne HTML apparoistre grisés (ce qui est le comportement de JLabel
s 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 JLabel
s 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 JLabel
s 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?
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 JLabel
s 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 ...