JLabel nicht abgeblendet, wenn sie deaktiviert, wenn HTML-Text angezeigt
-
19-09-2019 - |
Frage
Wie erhalte ich eine JLabel
einen HTML-String Anzeigen erscheinen abgeblendet (das ist das Verhalten von JLabel
s, die nicht HTML-Text angezeigt werden können)? Gibt es eine andere Art und Weise als dies tatsächlich die Farbe selbst zu ändern, indem die foreground
Eigenschaft zu modifizieren?
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
Vielen Dank für alle Ihre Antworten. Von dem, was ich sammle, scheint es, dass Java nicht automatisch von JLabel
s Vergrauung aus nicht unterstützt, wenn sie HTML-Text. Suraj Lösung hat kommen der Nähe des Updates die Einschränkungen berücksichtigen.
Ich habe jedoch versucht, einen anderen Out-of-the-Box-Ansatz, wo ich die HTML-Text JLabel
s gesetzt habe innerhalb eines inneren JPanel
und tat dies:
mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value
Was nicht funktioniert hat. Irgendwelche Vorschläge für diese Weise?
Lösung
Wenn der Text HTML ist, wird der Text wegen des folgenden Code in BasicLabelUI#paint()
abgeblendet wont
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, paintTextR);
}
Wie Sie sehen können, wenn der Text html ist, dann wird die Ansicht verwendet zu malen und es wird nicht überprüft wheter das Etikett aktiviert ist oder nicht. Daher müssen wir es explictly wie unten dargestellt tun:
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>");
}
});
Andere Tipps
Implementiert Lösung:
Color foreground = (shouldShow) ? SystemColor.textText : SystemColor.textInactiveText;
for (Component comp : mInnerPanel.getComponents())
{
comp.setForeground(foreground);
}
Caved in und gebrauchtem setForeground
am Ende, wie es scheint, dass Java scheint explizit die enabled
Eigenschaft zu ignorieren, wenn JLabel
s Malerei, solange es HTML-Text enthält. Siehe auch @ Suraj Antwort , für "reine" Lösung.
würde ich folgendes vorschlagen, die hier zur Verfügung gestellten Kombination aus beiden Lösungen ist:
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);
}
}
Sie können die Schriftfarbe im HTML angeben.
überschreiben Sie die paint-Methode in der Benutzeroberfläche, stellen Sie die Client-Eigenschaft BasicHTML.propertyKey auf null, wenn es deaktiviert ist und rufe Super ...