سؤال

كيف أحصل على JLabel عرض سلسلة HTML لتظهر رمي (وهو سلوك JLabelS التي لا تعرض نص 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

شكرا جزيلا على كل ردودكم. من ما أجمع، يبدو أن جافا لا يدعم الرماد التلقائي من JLabelS عند استخدام نص HTML. حل سوراج لقد أصبح الأقرب إلى الإصلاح بالنظر إلى القيود.

ومع ذلك، فقد حاولت نهجا مختلفا خارج مربع، حيث وضعت نص HTML JLabelS داخل الداخلية 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 إذا تم تعطيلها واستدعاء سوبر ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top