如何将图像添加到动态创建的JTable中

时间:2017-11-17 13:52:00

标签: java swing jtable

我有一个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;
        }
    }
}

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?