JLabel не отображается серым цветом, когда отключен, когда отображается текст HTML.
-
19-09-2019 - |
Вопрос
Как мне получить 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
Что не сработало.Есть какие-нибудь предложения по этому поводу?
РЕДАКТИРОВАТЬ:Добавлен реализованное решение.
Решение
Если текст 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);
}
}
Вы можете указать цвет шрифта в HTML.
Переопределить метод рисования в пользовательском интерфейсе, установить свойство клиента BasicHTML.propertyKey обнулить, если он отключен, и вызвать супер...