2010-07-11 70 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