Non JLabel in grigio quando disattivato, quando il testo HTML visualizzato
-
19-09-2019 - |
Domanda
Come faccio ad avere un JLabel
visualizzazione di una stringa HTML ad apparire in grigio (che è il comportamento di JLabel
s che non visualizzano testo HTML)? C'è un altro modo che in realtà cambiando il colore stesso modificando la proprietà 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
La ringrazio molto per tutte le vostre risposte. Da quanto ho capito, sembra che Java non supporta ingrigimento automatica di JLabel
s quando usano testo HTML. soluzione di Suraj è venuto più vicino alla correzione considerando i limiti.
Ho però provato un diverso out-of-the approccio di dialogo, dove ho messo le JLabel
s testo HTML all'interno di un JPanel
interiore e ha fatto questo:
mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value
Il che non ha funzionato. Eventuali suggerimenti per questo modo?
EDIT: Aggiunto soluzione implementata href="https://stackoverflow.com/questions/2242542/jlabel-not-greyed-out-when-disabled-when-html-text-displayed/2249050#2249050"> .
Soluzione
Se il testo è HTML, il testo solito essere disattivata 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 è selezionata wheter l'etichetta è abilitato 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>");
}
});
Altri suggerimenti
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 la pittura JLabel
s purché contiene testo HTML. Vedi anche @ risposta di Suraj , per soluzione "puro".
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);
}
}
È possibile specificare il colore del carattere nel codice HTML.
l'override del metodo paint nell'interfaccia utente, impostare la proprietà client BasicHTML.propertyKey per nulla se si è disattivato e chiamare eccellente ...