2010-02-11 9 views
9

Come ottengo un JLabel che visualizza una stringa HTML che appare in grigio (che è il comportamento di JLabel s che non visualizza testo HTML)? Esiste un altro modo di modificare effettivamente il colore modificando la proprietà foreground?JLabel non è disattivato quando disabilitato, quando viene visualizzato il testo HTML

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 

La ringrazio molto per tutte le vostre risposte. Da quanto ho capito, sembra che Java non supporti l'ingrigimento automatico di JLabel s quando usano il testo HTML. Suraj's solution è arrivato più vicino alla correzione considerando le limitazioni.

ho però provato un diverso out-of-the approccio di dialogo, in cui ho messo il testo HTML JLabel s all'interno di un interno JPanel e ha fatto questo:

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

che non ha funzionato. Qualche suggerimento per questo modo?


MODIFICA: aggiunto implemented solution.

+0

si dovrebbe modificare la tua domanda originale non inviare un altro – Lombo

+0

@Lombo, il mio male, non mi rendevo conto - eliminato il quello precedente ora. – bguiz

+0

Sembra corretto in Java 1.7. – SystemParadox

risposta

10

Se il testo è HTML, il testo non sarà in grigio a causa del seguente codice nel BasicLabelUI#paint()

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

Come si può vedere se il testo è HTML, poi la vista viene utilizzato per dipingere e non è controllato se l'etichetta è abilitata o meno. Quindi abbiamo bisogno di farlo esplicitamente come illustrato di seguito:

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' funziona, quindi suggerirei di utilizzarlo invece di alterare il testo dell'etichetta per cambiare il colore. – lins314159

+0

Cambiare HTML potrebbe non essere una buona pratica per quanto mi riguarda. – user12458

0

È possibile specificare il colore del carattere nell'HTML.

+0

@ camickr: Quindi dovrei farlo ogni volta che cambia lo stato abilitato/disabilitato? – bguiz

+0

Sì, ed è per questo che l'utilizzo del metodo setForeground() è ancora la soluzione più semplice. – camickr

0

sovrascrivere il metodo paint nell'interfaccia utente, impostare la proprietà client BasicHTML.propertyKey a null se è disabile e chiamare Super ...

+1

@sreejith ... a quanto pare non funzionerà, per due motivi a) se si imposta BasicHTML.propertyKey per null allora qualsiasi componente che usa il rendering html fallirà nel dipingere html b) sebbene il testo sarà visualizzato in grigio, visualizzerà l'html di istrie, che visualizzerà " HTML text" invece di testo HTML. :) –

4

soluzione implementata:

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

ceduto ed utilizzato setForeground, alla fine, come sembra che Java sembra ignorare in modo esplicito la proprietà enabled quando p ainting JLabel s a condizione che contenga testo HTML. Vedi anche @Suraj's answer, per la soluzione "pura".

2

Vorrei suggerire il seguente, che è una combinazione di due soluzioni fornite qui:

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