【问题标题】:JAVA: Put Image in jTable CellJAVA:将图像放入 jTable 单元格
【发布时间】:2023-12-24 12:17:01
【问题描述】:

我需要在其中一个 jTable 单元格中显示图像。
我是这样写的:

class ImageRenderer extends DefaultTableCellRenderer {
    JLabel lbl = new JLabel();

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column) {
        lbl.setText((String) value);
        lbl.setIcon(new ImageIcon("/home/ariyan/Desktop/71290452.jpg"));
        return lbl;
    }
}

然后这样使用它:

    jTable1.getColumn(0).setCellRenderer(new ImageRenderer());

但这没有用
我怎么能这样做?

谢谢

【问题讨论】:

    标签: java image swing jtable cell


    【解决方案1】:

    JTable 已经为图像提供了默认渲染器。你只需要告诉表格每列包含什么类型的数据,它就会选择最好的渲染器:

    a) 覆盖 JTable 或 TableModel 的 getColumnClass() 方法以返回列中数据的类。在这种情况下,您应该返回一个 Icon.class。

    b) 将 ImageIcon 添加到表模型中。

    现在 JTable 将为该列使用默认的图标渲染器。

    【讨论】:

    【解决方案2】:

    嗯:jTable1.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer()); 或许?

    这是我整理的一些快速测试代码的相关摘录,以快速验证我的猜测。它显示文件夹中的图标(它假定文件夹中的所有文件都是图标,因此您应该使用 XDG 图标主题子目录之类的东西对其进行测试)。先安装表格模型,然后在列上添加单元格渲染器:

    class Renderer extends DefaultTableCellRenderer {
    
        @Override
        public Component getTableCellRendererComponent (JTable table,
                                                        Object value,
                                                        boolean isSelected,
                                                        boolean hasFocus,
                                                        int row, int column) {
            if(isSelected) {
                this.setBackground(table.getSelectionBackground());
                this.setForeground(table.getSelectionForeground());
            }
            else {
                this.setBackground(table.getBackground());
                this.setForeground(table.getForeground());
            }
            if(column == 0) {
                this.setText(list[row]);
            }
            else {
                // edit as appropriate for your icon theme
                this.setIcon(new ImageIcon("/usr/share/icons/default.kde4/16x16/apps/"+list[row]));
            }
            return this;
        }
    
    }
    class Model extends DefaultTableModel {
    
        @Override
        public boolean isCellEditable (int row, int column) {
            return false;
        }
    
        @Override
        public Object getValueAt (int row, int column) {
            return list[row];
        }
    
        @Override
        public int getRowCount () {
            return list.length;
        }
    
        @Override
        public int getColumnCount () {
            return 2;
        }
    
        @Override
        public String getColumnName (int column) {
            return column == 0? "Name" : "Preview";
        }
    
        @Override
        public Class<?> getColumnClass (int columnIndex) {
            return String.class;
        }
    }
    // edit base directory as appropriate for your icon theme of choice
    static String[] list=new File("/usr/share/icons/default.kde4/16x16/apps/").list();
    

    【讨论】:

    • 渲染器应该尽可能高效。每次调用渲染器时,您都不应该从磁盘读取图像。此外,在扩展默认渲染器时,您应该调用 super.getTableCellRendererComponent(...)。这将确保渲染器完全初始化,例如通过添加适当的边框以及设置默认颜色。
    • 当然不是。但是,嘿,我将其发布为概念,原型代码。不是一个真正有效的插入式解决方案!