JLabel не greyed при отключении, когда отображенный текст HTML

Как я получаю a JLabel отображение HTML представляет в виде строки для появления greyed (который является поведением JLabels, которые не отображают текст HTML)? Есть ли иначе, чем фактическое изменение цвета самостоятельно путем изменения foreground свойство?

JLabel label1 = new JLabel("Normal text");
JLabel label2 = new JLabel("HTML text");
// 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. Решение Suraj прибыло самое близкое к фиксации, рассмотрев ограничения.

Я имею однако, попробовал другой out-of-the подход поля, куда я поместил текст HTML JLabels во внутреннем JPanel и сделал это:

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

Который не работал. Какие-либо предложения для этого пути?


Править: Добавленное используемое решение.

9
задан Community 23 May 2017 в 12:21
поделиться

4 ответа

Если текст HTML, текст не будет закрашен серым цветом из-за следующего кода в BasicLabelUI#paint()

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

Как вы видите, если текст html, то для закрашивания используется View, и не проверяется, включена ли метка или нет. Следовательно, нам нужно сделать это явно, как показано ниже:

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>");
   }
  });
10
ответ дан 4 December 2019 в 13:01
поделиться

ну, опытная связь между объектами ( [[Прототип]] ) внутренняя, некоторые внедрения, как Mozilla, выставляют его как obj. __ первичный __ .

Метод Object.getOf 5-го издания ECMAScript необходим вам, но он сейчас не реализован на большинстве движков JavaScript.

Посмотрите на эту реализацию Джона Ресига, она имеет недостаток, она опирается на свойство constructor движков, которые не поддерживают __ proto __ :

if ( typeof Object.getPrototypeOf !== "function" ) {
  if ( typeof "test".__proto__ === "object" ) {
    Object.getPrototypeOf = function(object){
      return object.__proto__;
    };
  } else {
    Object.getPrototypeOf = function(object){
      // May break if the constructor has been tampered with
      return object.constructor.prototype;
    };
  }
}

Помните, что это не является 100% надежным, так как свойство constructor может изменяться для любого объекта.

-121--2224504-

Можно указать цвет шрифта в HTML.

0
ответ дан 4 December 2019 в 13:01
поделиться

Пользователь с некоторыми навыками Office может выполнить следующую последовательность за 1 минуту:

  • используйте обычный форматтер для унификации стиля кода, предпочтительно без обертки строки
  • подайте текст кода в Microsoft Excel в виде одного столбца
  • и замените все сдвоенные места на один и выполните другие замены
  • сортируйте столбец

. На этом этапе ключевые слова для дубликатов уже будут хорошо обнаружены. Но чтобы продолжить

  • добавить формулу компаратора во 2-й столбец и счетчик в 3-й
  • скопировать и вставить значения снова, сортировать и увидеть самые повторяющиеся строки
-121--3176626-

Говорят, что есть разница в производительности, но является ли она «значимой» будет зависеть от того, сколько динамических поисков происходит. Если у вас нет тысяч ссылок на DynamicResource, это, вероятно, не будет заметно в любом случае; если бы динамические ресурсы работали намного хуже статических, я подозреваю, что Blend был бы более консервативным в их генерации.

На самом деле, когда я выполнил наивный тест, я обнаружил контрантутивный результат, что DynamicResource работал быстрее , чем (с помощью 3000 ссылок на ресурс, я видел время загрузки около 200 мс, когда я использовал DynamicResource для всего и около 400 мс для StartResource).

Это было нереалистичным тестом по многочисленным причинам: все ссылки были к тому же самому, я бежал под отладчиком и т.д. и т.д. Но это предполагает, что было бы преждевременно прилагать усилия для изменения выхода Blend «на всякий случай» - и что если вы заметили замедление, это не обязательно может быть ошибкой ссылок DynamicResource - всегда измеряйте!

-121--1725409-

Реализованное решение:

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

Caved in и used setForeground в конце, поскольку, как представляется, Java явно игнорирует свойство enabled при рисовании JLabel , если оно содержит HTML-текст. См. также @ ответ Сураджа , «чистое» решение.

4
ответ дан 4 December 2019 в 13:01
поделиться

Переопределите метод paint в пользовательском интерфейсе, установите свойство клиента BasicHTML.propertyKey на null, если оно отключено, и вызовите супер...

0
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: