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
شكرا جزيلا على كل ردودكم. من ما أجمع، يبدو أن جافا لا يدعم الرماد التلقائي من JLabel
S عند استخدام نص HTML. حل سوراج لقد أصبح الأقرب إلى الإصلاح بالنظر إلى القيود.
ومع ذلك، فقد حاولت نهجا مختلفا خارج مربع، حيث وضعت نص 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، ثم يتم استخدام طريقة العرض للطلاء ولا يتم التحقق من ذلك، يتم تمكين الملصق أو لا. وبالتالي نحن بحاجة إلى القيام بذلك بطلبا كما هو موضح أدناه:
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
في النهاية، كما يبدو أن جافا يبدو أن تجاهل صراحة enabled
الممتلكات عند اللوحة JLabel
طالما أنه يحتوي على نص 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.
تجاوز طريقة الطلاء في UI، قم بتعيين خاصية العميل basichtml.propertykey. إلى NULL إذا تم تعطيلها واستدعاء سوبر ...