2010-07-11 90 views
3

我需要在jTable单元格之一中显示图像。
我写了这个:JAVA:将图像放入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()); 

但这并没有工作
我怎么能这样做?

谢谢

回答

1

嗯: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(); 
+0

渲染器应尽可能高效。每次渲染器被调用时,您都不应该从磁盘读取映像。此外,在扩展默认渲染器时,您应该调用super.getTableCellRendererComponent(...)。这将确保渲染器完全初始化,例如通过添加适当的边框以及设置默认的着色。 – camickr 2010-07-11 14:10:08

+0

当然不是。但嘿,我发布了这个概念,原型代码。不是一个真正的工作投入解决方案! – user268396 2010-07-11 16:04:32

6

JTable已经为图像提供了默认渲染器。您只需告诉表格中每列包含的数据类型,它将选择最佳的渲染器:

a)覆盖JTable的getColumnClass()方法或TableModel以返回柱。在这种情况下,你应该返回一个Icon.class。 b)将一个ImageIcon添加到表格模型中。

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

+0

如何在netbeans中做到这一点? – RYN 2010-07-11 16:33:12

+0

参见[*如何使用表:概念:编辑器和渲染器*](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)。 – trashgod 2012-11-06 18:41:29