Java 如何在JTable中显示图像?

Java 如何在JTable中显示图像?,java,swing,jtable,Java,Swing,Jtable,我想将数据库中的blob显示到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.ex

我想将数据库中的blob显示到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;
}
publicjtablegettable(字符串表、字符串查询)引发异常{
JTable t1=新的JTable();
DefaultTableModel dm=新的DefaultTableModel();
语句st=con.createStatement();
结果集rs=st.executeQuery(查询);
ResultSetMetaData rsmd=rs.getMetaData();
int cols=rsmd.getColumnCount();
字符串c[]=新字符串[cols];

对于(int i=0;i,DefaultTableModel通过调用其
toString()
方法将任何对象显示为字符串

   DefaultTableModel dm = new DefaultTableModel(){
     public class<?> getColumnClass(int columnIndex){
         return 6==columnIndex?ImageIcon.class, String.class;
     }
   };
如果要更改,必须通过重写
getColumnClass()
方法告诉DefaultTableModel列的内容

   DefaultTableModel dm = new DefaultTableModel(){
     public class<?> getColumnClass(int columnIndex){
         return 6==columnIndex?ImageIcon.class, String.class;
     }
   };
DefaultTableModel dm=新的DefaultTableModel(){
公共类getColumnClass(int columnIndex){
返回6==columnIndex?ImageIcon.class,String.class;
}
};
但是有可能
JTable
没有用于
ImageIcon
的DefaultRenderer,并且仍然显示意外的内容。在这种情况下,您还必须自己为类
ImageIcon
设置DefaultRenderer


您可以添加一个显示图标的渲染器。这样的渲染器如下所示:

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;
    }
}
可以通过多种方式添加此渲染器:

  • 为ImageIcon类注册渲染器:

    table.setDefaultRenderer( ImageIcon.class, new IconCellRenderer( ) );
    
  • 为列指定渲染器:

    int imageViewIndex = table.convertColumnIndexToView( 6 ); // view index of ImageIcon data
    table.getColumnModel( ).getColumn( imageViewIndex ).setRenderer( new IconCellRenderer( ) );
    
  • 子类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 );
        }
    };