2016-11-22 101 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); 
        } 
    };