JLabel не выделяется серым цветом при отключении, когда отображается текст HTML
Как заставить JLabel, отображающую строку HTML, казаться серым (что является поведением JLabels, которые не отображают текст HTML)? Есть ли другой способ, чем на самом деле изменить цвет, изменив СВОЙСТВО 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
Большое вам спасибо за все ваши ответы. Из того, что я понял, кажется, что Java не поддерживает автоматическое поседение из
JLabels, когда они используют HTML-текст. решение Сураджа подошло ближе всего к решению, рассматривая ограничения.
Я, однако, попробовал другой подход из коробки, где я поместил HTML-текст JLabelвнутри внутреннего JPanel и сделал это:
mInnerPanel.setEnabled(shouldShow); //shouldShow is a boolean value
Который не сработал. Есть предложения по этому пути?
EDIT: добавленореализованное решение .
5 ответов:
Если текст HTML, текст не будет серым из-за следующего кода в
BasicLabelUI#paint()View v = (View) c.getClientProperty(BasicHTML.propertyKey); if (v != null) { v.paint(g, paintTextR); }Как вы можете видеть, если текст html, то вид используется для рисования и не проверяется, включена ли метка или нет. Следовательно, мы должны сделать это ясно, как показано ниже:
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>"); } });
Реализованное решение:
Color foreground = (shouldShow) ? SystemColor.textText : SystemColor.textInactiveText; for (Component comp : mInnerPanel.getComponents()) { comp.setForeground(foreground); }Уступил и использовал
setForegroundв конце концов, поскольку кажется, что Java явно игнорирует свойствоenabledпри рисованииJLabels, пока оно содержит текст HTML. См. также ответы@Сурадж по, для "чистого" решения.
Я бы предложил следующее, которое является комбинацией двух решений, представленных здесь:
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); } }