2010-02-11 15 views
9

Gri ​​renkte görünecek bir HTML dizisi görüntüleyen bir JLabel nasıl elde edilir (HTML metnini görüntülemeyen JLabel s davranışı)? foreground özelliğini değiştirerek rengini değiştirmekten başka bir yolu var mı? JLabel, HTML metni görüntülendiğinde devre dışı kaldığında grileştirilmiyor

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 

size yanıtların tümü için çok teşekkür ederiz. Topladığımdan, Java'nın HTML metni kullandığı zaman JLabel s otomatik grileşmeyi desteklemediği görülüyor. Suraj's solution, sınırlamalara göre düzeltmeye en yakın olanı oldu.

Ben ancak denedi farklı dışı Şu iç JPanel içinde HTML metni JLabel s koymak ve bunu gelmiş kutu yaklaşımı,:

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

çalışmıyor. Bu şekilde herhangi bir öneriniz var mı?


EDIT: Added implemented solution.

+0

ben fark etmedim, orijinal soru benim kötü bir tane – Lombo

+0

@Lombo, yayınlamayın düzenlemeniz gerekir - silindi şimdi bir önceki. – bguiz

+0

Bu, Java 1.7'de düzeltilmiş gibi görünüyor. – SystemParadox

cevap

10

, metin alışkanlık metin, ardından Görünüm boyamak için kullanılan html ise Gördüğünüz gibi BasicLabelUI#paint()

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

nedeniyle aşağıdaki kod gri ve tersi geçerli olmak etiketin etkin olup olmadığını kontrol edin. aşağıda gösterildiği gibi Dolayısıyla biz explictly bunu yapmak gerekir:

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>"); 
    } 
    }); 
+1

'setForeground' çalışır, bu yüzden rengi değiştirmek için etiket metnini değiştirmek yerine bunu kullanmayı öneririm. – lins314159

+0

HTML'yi değiştirmek, endişelendiğim sürece iyi bir uygulama olmayabilir. – user12458

0

HTML'de yazı tipi rengini belirtebilirsiniz. Metin HTML ise

+0

@camickr: Bu yüzden, etkin/devre dışı durum her değiştiğinde bunu yapmak zorunda mıyım? – bguiz

+0

Evet, bu nedenle setForeground() yönteminin kullanılması en kolay çözümdür. – camickr

0

geçersiz kılma arayüzünde boya yöntemi ... Devre dışıysa boş ve süper çağırmak için BasicHTML.propertyKey client özelliğini set

+1

@sreejith ... görünüşe göre işe yaramaz, iki nedenden dolayı a) BasicHTML'yi ayarlarsanız. –

4

Uygulanan solüsyon: Java açıkça p enabled özelliğini görmezden görünüyor göründüğü gibi

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

Caved ve sonunda setForeground kullanılan HTML metni içerdiği sürece JLabel ainting. "Saf" çözüm için ayrıca bkz. @Suraj's answer.

2

Burada sağlanan iki çözümden birleşimidir aşağıdakileri, öneririm:

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); 
    } 
} 
İlgili konular