2013-10-26 25 views
0

我想爲特定的列設置一個渲染器,但不知何故,這個渲染器並未用於渲染該列。這有什麼解釋嗎?setCellRenderer()不起作用

tabledata = new LendDataTable(); 
table.setModel(tabledata); 
TableColumn xx = table.getColumnModel().getColumn(3); 
xx.setCellRenderer(new BookBackRenderer());//here it doesn't (there are 7 rows in total) 
table.setDefaultRenderer(Integer.class, new BookBackRenderer());// here it works 
add(table, BorderLayout.CENTER); 



public class BookBackRenderer extends DefaultTableCellRenderer { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public BookBackRenderer() { 
    // TODO Auto-generated constructor stub 

} 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 


    System.out.println(column); 
    return super.getTableCellRendererComponent(table, value.toString() + "xy", isSelected, hasFocus, row, column); 
} 

}

的問題似乎realted到的TableModel。有一次,我用它工作perfect.Code我的臺式一個DefaultTableModel:

/** 
* 
*/ 
package client.gui; 

import java.awt.Component; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.EventObject; 
import java.util.LinkedList; 
import java.util.List; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.event.CellEditorListener; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 
import javax.swing.text.DateFormatter; 

import org.json.JSONArray; 

import lbvs.Leiheintrag; 

/** 
* @author John 
* 
*/ 
public class LendDataTable extends AbstractTableModel implements 
TableModel{ 
    private List<Leiheintrag> lendlist; 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * 
    */ 
    public LendDataTable() { 
     // TODO Auto-generated constructor stub 
     lendlist = new LinkedList<Leiheintrag>(); 
    } 
    public void setData (List<Leiheintrag> list) 
    { 
     lendlist = list; 
     this.fireTableStructureChanged(); 
     this.fireTableDataChanged(); 



    } 

    /* (non-Javadoc) 
    * @see javax.swing.table.TableModel#getRowCount() 
    */ 
    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return lendlist.size(); 
    } 

    /* (non-Javadoc) 
    * @see javax.swing.table.TableModel#getColumnCount() 
    */ 
    @Override 
    public int getColumnCount() { 
     // TODO Auto-generated method stub 
     return 7; 
    } 

    /* (non-Javadoc) 
    * @see javax.swing.table.TableModel#getValueAt(int, int) 
    */ 
    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     // TODO Auto-generated method stub 
     Leiheintrag eintr = lendlist.get(rowIndex); 
     switch (columnIndex){ 
     case 0: 
      return eintr.getBuch(); 
     case 1: 
      return eintr.getLeihdatum(); 
     case 2: 
      return eintr.getAbgabe_bis(); 
     case 3: 
      return ((Long)eintr.getRueck_datum()); 
     case 4: 
      return eintr.getBezahlt_am(); 
     case 5: 
      return eintr.getKosten(); 
     case 6 : 
      return eintr.getLast_edit_user(); 
     default: 
      return null; 


     } 
    } 
    public Class<?> getColumnClass(int columnIndex){ 
     switch (columnIndex){ 
     case 0: 
      return Integer.class; 
     case 1: 
      return Long.class; 
     case 2: 
      return Long.class; 
     case 3: 
      return Long.class; 
     case 4: 
      return Long.class; 
     case 5: 
      return Float.class; 
     case 6 : 
      return Integer.class; 
     default: 
      return null; 


     } 
    } 
} 

感謝你的幫助

+0

你看看@ http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer –

+1

我非常害怕這個將要求*調試*;爲了調試,我們需要完整的代碼。把你的問題歸結爲一個可運行的小例子,如果這不能告訴你問題本身是什麼,它會給我們其他人一些工作。 – arcy

+0

在你的'LendDataTable'類中,你重寫了['getColumnClass'](http://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html#getColumnClass(int))方法?這將默認返回Object.class,因此設置Integer的渲染器將不會執行任何操作。 –

回答

4

的問題似乎realted到的TableModel。一旦我使用了DefaultTableModel,它就完美了

下面的方法似乎是問題所在。

public void setData (List<Leiheintrag> list) 
{ 
    lendlist = list; 
    this.fireTableStructureChanged(); 
    this.fireTableDataChanged(); 
} 

當你調用fireTableStructureChange()了JTable重建,這意味着你的渲染器的TableColumnModel(和所有的TableColumn來)將不再與相關的TableColumn 3.

我想你可以只使用fireTableDataChanged(),或如果這不起作用,然後使用fireTableRowsInserted()

如果您想要查看DefaultTableModel的源代碼,請參閱setDataVector()方法調用的內容,因爲兩種模型的概念都是相同的。

1

@camickr在說什麼,顯然是true。但我認爲有一件重要的事情要提及。

fireTableStructureChanged的JAVA DOC中明確指出:

JTable.setModel(model)呼叫或在接收到由fireTableStructureChanged函數調用燒製event,如果autoCreateColumnsFromModel被設置(trueJTable將丟棄它有任何表列和按默認列出現在模型中的順序重新分配默認列。而不是刪除fireTableStructureChanged()電話,我認爲設置autoCreateColumnsFromModel標誌爲false就足夠了。要設置或取消此標誌:

JTable.setAutoCreateColumnsFromModel(boolean) 
+0

是的,設置autoCreateColumnFromModel(假)會工作(知道這種方法很重要),但真正的問題是因爲s​​etData()方法沒有正確實現。解決問題比掩蓋症狀更好。 – camickr

+0

@camickr,我同意你的看法。 :) – Sage