Frage

Wie erhalte ich eine JLabel einen HTML-String Anzeigen erscheinen abgeblendet (das ist das Verhalten von JLabels, 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 JLabels 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 JLabels 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?


EDIT: Hinzugefügt implementierte Lösung .

War es hilfreich?

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 JLabels 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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top