【问题标题】:How to add Images to a dynamically created JTable如何将图像添加到动态创建的 JTable
【发布时间】:2017-11-17 23:34:58
【问题描述】:

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

【问题讨论】:

    标签: java swing jtable


    【解决方案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());
    

    【讨论】:

    • 这行得通。我已经有一个用于字体颜色的单元格渲染器,但我没有得到它必须覆盖setValue()。谢谢!
    • @omnomnom,不需要自定义渲染器。您需要做的就是返回“Icon.class”,表格将使用其默认的图标渲染器。该表将使用默认渲染器,每个 LAF 可能(或可能不)不同。除非确实需要,否则不要创建渲染器。
    【解决方案2】:

    我有一个从 List 对象动态创建的 JTable。

    您不能只将字符串添加到表中,因为需要将图像添加为 ImageIcon。所以你需要一个 List 来添加 String 和 Icon 值。

    然后,您需要覆盖 TableModel 的 getColumnClass(...) 方法以返回包含图标的列的 Icon.class。然后表格将使用适当的图标渲染器。

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

    【讨论】:

    • 我已经覆盖了getColumnClass(),它正在为我的代码中包含图标的所有列返回ImageIcon.class
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多