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

How to add Images to a dynamically created 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;
        }
    }
}

您需要为 table

安装渲染器

这是渲染器:

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

I have a JTable which I create dynamically from List objects.

好吧,您不能只将字符串添加到 table,因为那时需要将图像添加为 ImageIcon。所以你需要一个列表,这样你就可以添加字符串和图标值。

然后您需要将包含图标的列的 TableModel 的 getColumnClass(...) 方法覆盖为 return Icon.class。 table 然后将为图标使用适当的渲染器。

有关工作示例,请参阅:How to set icon in a column of JTable?