JLabel не выделяется серым цветом при отключении, когда отображается текст HTML
Как заставить JLabel
, отображающую строку HTML, казаться серым (что является поведением JLabel
s, которые не отображают текст 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 не поддерживает автоматическое поседение из
JLabel
s, когда они используют 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
при рисованииJLabel
s, пока оно содержит текст 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); } }