2016-11-22 115 views
1

我想從數據庫中顯示blob到一個JTable列。 我的代碼如下:如何在JTable中顯示圖像?

public JTable getTable(String table,String query)throws Exception{ 

    JTable t1 = new JTable(); 

    DefaultTableModel dm = new DefaultTableModel(); 
    Statement st = con.createStatement(); 
    ResultSet rs = st.executeQuery(query); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    int cols = rsmd.getColumnCount(); 
    String c[] = new String[cols]; 
    for(int i=0;i<cols;i++){ 
     c[i]=rsmd.getColumnName(i+1); 
     dm.addColumn(c[i]); 
    } 


    //get data from rows 

    Object row[]=new Object[cols]; 
    while(rs.next()){ 
     row[0] = rs.getString(1); 
     row[1] = rs.getString(2); 
     row[2] = rs.getString(3); 
     row[3] = rs.getString(4); 
     row[4] = rs.getString(5); 
     row[5] = rs.getString(6); 
     java.sql.Blob blob = rs.getBlob(7); 
     int blobLength = (int) blob.length(); 
     byte[] blobAsBytes = blob.getBytes(1, blobLength); 
     ImageIcon picture = new ImageIcon(blobAsBytes); 

     row[6] = picture; 
     row[7] = rs.getString(8); 
     row[8] = rs.getString(9); 

     dm.addRow(row); 
    } 

    t1.setModel(dm); 
    con.close(); 
    return t1; 
} 

當我運行這段代碼JTable的dispays:[email protected]*numbers*而不是圖像本身。

回答

2

DefaultTableModel通過調用其toString()方法將任何對象顯示爲字符串。

如果您想要更改,您必須通過重寫getColumnClass()方法來告訴DefaultTableModel該列的內容。

DefaultTableModel dm = new DefaultTableModel(){ 
    public class<?> getColumnClass(int columnIndex){ 
     return 6==columnIndex?ImageIcon.class, String.class; 
    } 
    }; 

但是有一個機會,JTable沒有DefaultRenderer爲ImageIcon,仍然顯示意想不到的事情。在這種情況下,您還必須自己爲ImageIcon類設置DefaultRenderer。

https://docs.oracle.com/javase/tutorial/uiswing/components/table.html

JTable Cell Renderer

0

您可以添加顯示一個圖標渲染。這樣的渲染器是這樣的:

public class IconCellRenderer extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     ((JLabel) c).setIcon((ImageIcon) value); 
     ((JLabel) c).setText(""); 
     return c; 
    } 
} 

您可以添加此渲染幾個方面:

  1. 註冊一個渲染器的ImageIcon類:

    table.setDefaultRenderer(ImageIcon.class, new IconCellRenderer()); 
    
  2. 指定渲染一列:

    int imageViewIndex = table.convertColumnIndexToView(6); // view index of ImageIcon data 
    table.getColumnModel().getColumn(imageViewIndex).setRenderer(new IconCellRenderer()); 
    
  3. 子類的JTable並重寫getCellRenderer:

    final int imageModelIndex = 6; // model index of ImageIcon data 
    JTable table = new JTable() { 
        TableCellRenderer imageIconRenderer = new IconCellRenderer(); 
        @Override 
        public TableCellRenderer getCellRenderer(int row, int column) { 
         if(convertColumnIndexToModel(column) == imageModelIndex) 
          return imageIconRenderer; 
         else 
          return super.getCellRenderer(row, column); 
        } 
    };