2009-05-03 24 views
7

Bu beni kesinlikle deli ediyor.JTable hücre rengini değiştirme

JTable ile tablo hücrelerinin biçimlendirmesini değiştirmek için kendi oluşturucumu kullanmam gerektiğini biliyorum. Fakat bunu düzgün bir şekilde uygulayamıyorum.

Bu benim şimdiki kurgusunda:

public class MyClass 
{ 
    public static void main(String args[]) 
    { 
     JTable myTable = new JTable(10, 10); 
     myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer()); 
    } 
} 

class CustomRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     // Formatting 
     return c; 
    } 
} 

Ne setDefaultRenderer ilk parametre için kullanmak gerekir? API sadece 'sınıf' diyor. Oraya ne koyacağımı bilmiyorum.

Birisi, en basit terimlerle, bunu nasıl uygulamaya koyduğumu açıklayabilir mi? Lütfen, biçimlendirmeyi main() yönteminden nasıl değiştirebileceğimin bir örneğini de sağlayın.

cevap

13

setDefaultRenderer için ilk parametrede, oluşturmayı geçersiz kılmak istediğiniz Sınıf için sınıf literal'u yerleştirin. Veri dizeleri tüm oluşur eğer veriler de sınıfları olarak BigDecimal veya Integer ile değerlerin oluşuyorsa Yani, sen

myTable.setDefaultRenderer(String.class, new CustomRenderer()); 

koyabilirsiniz, her sınıf türü (BigDecimal.class veya Integer.class için bu metodu iki defalarca başvuracağımız herbir durumda).

Ve son olarak, Oluşturucu bunu arka plan rengini değiştirmek için: Bir renderer yazarsanız

class CustomRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     c.setBackground(new java.awt.Color(255, 72, 72)); 
     return c; 
    } 
} 

bir arayüz ait tüm sınıfları için çalışması gerektiğini, ayrıca değiştirmeniz gerekir getColumnClass sizin masa modeli işlevi ve bu arabirim uygulamak tüm nesneler için arabirim sınıfı dönelim:

public Class<? extends Object> getColumnClass(int c) { 
    Object object = getValueAt(0, c); 
    if(object == null) { 
     return Object.class; 
    if(getValueAt(0, c) instanceof IColorable) { 
     return ICarPart.class; 
    } else { 
     return getValueAt(0, c).getClass(); 
    } 
} 

Wi Bir IColorable.class için bir oluşturucu kaydedebilir ve her uygulama için ayrı bir oluşturucu kaydettirmek gerekmez.

+0

Bu benim için çalışmıyor gibi gözüküyor. Yaptığım tek şey setDefaultRenderer yöntemini çağırmak ve CustomRenderer sınıfını oluşturmak. Bunu işe almak için yapmam gereken başka bir şey var mı? –

+2

Bunu String.class yerine Object.class kullanarak çalıştım. Yine de neden gerekli olduğuna emin değilim, çünkü tüm verilerim dizgilerdi. Yardımlarınız için teşekkür ederiz! –

+0

İşleyiciyi bir dinleyicinin içinde değiştirmem mümkün mü? Bir düğmeye basıldığında tabloyu yeniden biçimlendirmek istiyorum. –

İlgili konular