Как я получаю a JLabel
отображение HTML представляет в виде строки для появления greyed (который является поведением JLabel
s, которые не отображают текст 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 не поддерживает автоматический седеющий из JLabel
s, когда они используют текст HTML. Решение Suraj прибыло самое близкое к фиксации, рассмотрев ограничения.
Я имею однако, попробовал другой out-of-the подход поля, куда я поместил текст HTML JLabel
s во внутреннем 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, то для закрашивания используется 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>");
}
});
ну, опытная связь между объектами ( [[Прототип]]
) внутренняя, некоторые внедрения, как 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
может изменяться для любого объекта.
Можно указать цвет шрифта в HTML.
Пользователь с некоторыми навыками Office может выполнить следующую последовательность за 1 минуту:
. На этом этапе ключевые слова для дубликатов уже будут хорошо обнаружены. Но чтобы продолжить
Говорят, что есть разница в производительности, но является ли она «значимой» будет зависеть от того, сколько динамических поисков происходит. Если у вас нет тысяч ссылок на 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-текст. См. также @ ответ Сураджа , «чистое» решение.
Переопределите метод paint в пользовательском интерфейсе, установите свойство клиента BasicHTML.propertyKey на null, если оно отключено, и вызовите супер...