Java 如何在JTable中显示图像?
我想将数据库中的blob显示到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
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 );
}
};