我有一个JTable
,我是从List<String>
个对象动态创建的。我这样做可能完全错了,但它确实有效。我唯一能做的就是在某些单元格中添加图像。
它所做的只是将ImageIcon
对象名称作为字符串添加到单元格中。请参阅下面的代码。
private static Image doneImage = getIconImage("doneImage");
private static Image notDoneImage = getIconImage("notDoneImage");
private DefaultTableModel model = new DefaultTableModel(){
@Override
public Class<?> getColumnClass(int column){
if ((column & 1) != 0 ){
return ImageIcon.class;
}else{
return String.class;
}
}
};
initTables();
JTable table = new JTable();
table.setModel(model);
private void initTables(){
model.addRow(new Object[]{});
int rowsToAdd = 0;
int rowCount = 0;
int columnId = 0;
for(HouseObject aHouse : houses){
for(RoomObject aRoom : aHouse.getRooms()){
model.addColumn(null);
model.addColumn(aRoom.getId());
model.setValueAt(aRoom.getId(), 0, columnId);
if (rowCount < aRoom.getEvents().size()){
rowsToAdd = aRoom.getEvents().size() - model.getRowCount();
for(int i = 0; i <= rowsToAdd; i++){
model.addRow(new Object[]{});
}
rowCount = model.getRowCount();
}
for(int i = 0; i < aRoom.getEvents().size(); i++){
model.setValueAt(aRoom.getEvents().get(i).getId(), i+1, columnId);
for(String houseDone : housesDone){
if(aRoom.getEvents().get(i).getId().contains(houseDone)){
model.setValueAt(doneImage , i+1, columnId+1); // this does not work
}else{
model.setValueAt(notDoneImage, i+1, columnId+1);
}
}
}
columnId = columnId+2;
}
}
}
答案 0 :(得分:1)
您需要为表格安装渲染器
这是渲染器:
public class IconTableCellRenderer extends DefaultTableCellRenderer {
@Override
protected void setValue(Object value) {
if (value instanceof Icon) {
setText(null);
setIcon((Icon) value);
} else {
super.setValue(value);
}
}
}
所以你必须安装它:
JTable table = new JTable();
table.setModel(model);
table.setDefaultRenderer(ImageIcon.class, new IconTableCellRenderer());
答案 1 :(得分:1)
我有一个JTable,我是从List对象动态创建的。
那么你不能只是将Strings添加到表中,因为那时需要将image添加为ImageIcon。因此,您需要一个List,以便添加String和Icon值。
然后,您需要覆盖TableModel的getColumnClass(...)
方法,以便为包含Icon的列返回Icon.class
。然后,该表将使用适当的图标渲染器。
有关工作示例,请参阅:How to set icon in a column of JTable?。