2015-05-01 41 views
0

我試圖顯示從BLOB數據類型的MySQL數據庫檢索圖像。無法弄清楚導致圖像列顯示數據的問題是什麼,例如[[email protected]而不是圖像圖標。在JTable的單個列中顯示來自MySQL數據庫的圖像

DefaultTableModel model = new DefaultTableModel(new Object[]{ 
    "image", "item_name", "quantity","price", "category", "color", "size"}, 0){ 
     @Override 
     public Class<?> getColumnClass(int column) { 
      switch(column){ 
       case 0: return ImageIcon.class; 
       default: return String.class; 
      } 
     } 
    }; 

    myTable.setModel(model); 

...

  ResultSet rs = database.getRS(); 

      int columns = rs.getMetaData().getColumnCount(); 

      while(rs.next()){ 
       Object[] row = new Object[columns]; 
       for(int i = 1; i <= columns; i++){       
        row[i-1] = rs.getObject(i); 

       } 
       DefaultTableModel defmodel = (DefaultTableModel) tableItem.getModel(); 
       defmodel.insertRow(rs.getRow()-1, row); 

      } 
+0

模型中的數據(來自我所能猜到的)是一個'byte []',而不是一個有效的圖像。數據庫中存儲的數據如何(通過什麼方式)? – MadProgrammer

+0

@MadProgrammer在localhost/phpmyadmin中。 Type是MediumBlob。 – chaoqunli

+0

@MadProgrammer存儲的值是[BLOB - 17.1 KiB]。 – chaoqunli

回答

1

既然你用preparedstatement.setBlob(1, InputStream);存儲圖像,我必須假設你的物理存儲的圖像文件/格式,而不僅僅是像素數據。

您需要讀回該圖像格式並將其轉換爲Swing/Java支持的圖像格式。

開始通過得到Blob參考數據庫字段...

Blob blob = rs.getBlob(1); 

一旦你有一個Blob,你可以用它的二進制InputStream和讀取數據...

BufferedImage image = null; 
try (InputStream is = blob.getBinaryStream()) { 
    image = ImageIO.read(is); 
} catch (IOException exp) { 
    exp.printStackTrace(); 
} 

現在,您可以使用new ImageIcon(image)將其設置爲ImageIcon,並將其置於您的表格模型中...

+0

對不起,我對這部分感到困惑。嘗試(InputStream is = rs.getBinaryStream()) – chaoqunli

+0

[嘗試與資源](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – MadProgrammer

+0

是這行可選? Blob blob = rs.getBlob(1); – chaoqunli

相關問題