0

我正在尝试为特定列设置渲染器,但不知何故,该渲染器并未用于渲染该列。对此有什么解释吗?

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);
}

}

问题似乎与 TableModel 相关。一旦我使用 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;


        }
    }
}

谢谢您的帮助

4

2 回答 2

5

问题似乎与 TableModel 相关。一旦我使用 DefaultTableModel 它就可以完美运行

下面的方法似乎是问题所在。

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

当您调用fireTableStructureChange()JTable 时,将重新创建 TableColumnModel(以及所有 TableColumns),这意味着您的渲染器将不再与 TableColumn 3 关联。

我认为您可以只使用fireTableDataChanged(),或者如果这不起作用,则使用 fireTableRowsInserted().

如果您愿意,可以查看源代码DefaultTableModel以查看该setDataVector()方法调用的内容,因为这两个模型的概念是相同的。

于 2013-10-26T15:19:51.707 回答
1

what @camickr is saying, is apparently true. But i think there is one important things to mention.

The JAVA DOC of fireTableStructureChanged clearly states that:

with JTable.setModel(model) call or upon receiving the event fired by fireTableStructureChanged function call, if autoCreateColumnsFromModel is set(true) JTable will discards any table columns that it had and reallocates default columns in the order they appear in the model. Instead of removing fireTableStructureChanged() call, i think setting autoCreateColumnsFromModel flag to false is sufficient. To set or unset this flag use:

JTable.setAutoCreateColumnsFromModel(boolean)
于 2013-10-26T18:35:51.140 回答