2010-02-11 12 views
9

Wie bekomme ich eine JLabel Anzeige einer HTML-Zeichenfolge grau angezeigt (das ist das Verhalten von JLabel s, die HTML-Text nicht anzeigen)? Gibt es eine andere Möglichkeit, als die Farbe selbst zu verändern, indem man die Eigenschaft foreground ändert? JLabel nicht ausgegraut, wenn deaktiviert, wenn HTML-Text angezeigt

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. Aus dem, was ich erfahre, scheint es, dass Java kein automatisches Ausgrauen von JLabels unterstützt, wenn sie HTML-Text verwenden. Suraj's solution ist dem Fix unter Berücksichtigung der Einschränkungen am nächsten gekommen.

ich aber habe, versucht, eine andere Out-of-the-Box-Ansatz, wo ich den HTML-Text JLabel s innerhalb eines inneren JPanel und tat dies gesetzt haben:

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

Was nicht funktioniert hat. Irgendwelche Vorschläge für diesen Weg?


EDIT: Hinzugefügt implemented solution.

+0

Sie Ihre ursprüngliche Frage nicht ein anderes – Lombo

+0

@Lombo bearbeiten sollte posten, meine schlecht, ich wusste nicht, dass - gelöscht die vorheriges jetzt. – bguiz

+0

Dies scheint in Java 1.7 behoben zu sein. – SystemParadox

Antwort

10

Wenn Text HTML ist, der Text wird nicht in wegen des folgenden Codes abgeblendet BasicLabelUI#paint()

 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 ist nicht überprüft, ob das Label aktiviert ist oder nicht Daher müssen wir es explizit tun, wie unten dargestellt:

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' funktioniert, also würde ich vorschlagen, dies zu verwenden, anstatt den Beschriftungstext zu ändern, um die Farbe zu ändern. – lins314159

+0

Das Ändern von HTML ist möglicherweise keine gute Übung, wenn es mich betrifft. – user12458

0

Sie können die Schriftfarbe im HTML-Code festlegen.

+0

@camickr: Also müsste ich das jedes Mal machen, wenn sich der aktivierte/deaktivierte Zustand ändert? – bguiz

+0

Ja, weshalb die Methode setForeground() immer noch die einfachste Lösung ist. – camickr

0

Aufschalten der paint-Methode in der Benutzeroberfläche, stellen Sie den Client-Eigenschaft BasicHTML.propertyKey auf null, wenn es deaktiviert ist und Super nennen ...

+1

@sreejith ... anscheinend wird es nicht funktionieren, aus zwei Gründen a) wenn Sie BasicHTML setzen.propertyKey auf null dann jede Komponente HTML-Rendering fehl html b malen), obwohl der Text in grau angezeigt wird, wird es das entrie html d angezeigt wird „ HTML Text“ Text anstelle von HTML angezeigt werden soll. :) –

4

Implementiert Lösung:

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

in Caved und verwendet setForeground am Ende, wie es scheint, dass Java die enabled Eigenschaft, wenn explizit zu ignorieren scheint p ainting JLabel s so lange wie es HTML-Text enthält. Siehe auch @Suraj's answer, für "reine" Lösung.

2

Ich würde 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); 
    } 
} 
Verwandte Themen