【问题标题】:How to display images in a JTable?如何在 JTable 中显示图像?
【发布时间】:2017-04-06 15:28:54
【问题描述】:

我想将数据库中的 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;
}

当我运行此代码时,JTable 显示:javax.swing.ImageIcon@*numbers* 而不是图像本身。

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    DefaultTableModel 通过调用其toString() 方法将任何对象显示为字符串。

    如果你想改变这一点,你必须通过覆盖 getColumnClass() 方法告诉 DefaultTableModel 列的内容是什么。

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

    但有可能JTable 没有ImageIcon 的DefaultRenderer 并且仍然显示一些意外的东西。在这种情况下,您还必须自己为 ImageIcon 类设置 DefaultRenderer。

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

    JTable Cell Renderer

    【讨论】:

      【解决方案2】:

      您可以添加一个显示图标的渲染器。这样的渲染器看起来像这样:

      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 );
            }
        };
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-08
        • 2017-05-07
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 2018-09-27
        相关资源
        最近更新 更多