I am trying to set a Renderer for a specific Column, but somehow this renderer is not being used for rendering that column. Is there any explanation for that?
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);
}
}
the problem seems to be realted to the TableModel. Once I use a DefaultTableModel it works perfect.Code for my table model:
/**
*
*/
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;
}
}
}
thank you for your help
the problem seems to be realted to the TableModel. Once I use a DefaultTableModel it works perfect
The method below would appear to be the problem.
public void setData (List<Leiheintrag> list)
{
lendlist = list;
this.fireTableStructureChanged();
this.fireTableDataChanged();
}
When you invoke fireTableStructureChange()
the JTable will recreate the TableColumnModel (and all the TableColumns) which means your renderer will no longer be associated with TableColumn 3.
I think you can just use the fireTableDataChanged()
, or if that doesn't work then use fireTableRowsInserted()
.
If you want you can take a look at the source code of the DefaultTableModel
to see what the setDataVector()
method invokes because the concept is the same for both models.
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.