我的思路是有些麻烦,但我这个小菜鸡能弄出来已经很开心啦!记录一下吧,嘻嘻嘻……
**思路:**读取数据库中图片Blob流,保存至本地,这样图片就会存在于本地文件中,再通过读取本地图片路径,重写getTableCellRendererComponent方法,渲染图片后显示在表格中。
注意的点:Vector和Object的使用要注意一下,我用的是Vector<Vector>类型。看代码体会下吧。
(1)mysql类
//前面是数据库连接,实现方法都大同小异,主要看下图片部分吧^-^
//这里的data是:Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while(result !=null && result.next()) {
//Object view [] = new Object[14];
Vector<Object> v = new Vector<Object>();
String man_id=result.getString(1);
int com_id=result.getInt(2);//返回的参数是man_id,commodities.id, name, photo, cur_price,raw_price, discount, category, material, color, size, brand, mading_area,sale_volume
String name=result.getString(3);
Blob photo=result.getBlob(4);//读取数据库中图片的Blob流
InputStream in = photo.getBinaryStream();
String pic = "./"+k+".jpg";//为图片设置不同的地址
FileOutputStream out = new FileOutputStream(pic);
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer))!=-1) {//将图片写入本地硬盘中
out.write(buffer,0,len);
}
k++;
out.close();
in.close();
System.out.print("pic"+pic);//测试
ImageIcon icon = new ImageIcon(pic);
icon.setImage(icon.getImage().getScaledInstance(40,40,Image.SCALE_DEFAULT));//设置图片在JTable中的大小
Image img = icon.getImage();
float cur_price=result.getFloat(5);
float raw_price=result.getFloat(6);
float discount=result.getFloat(7);
String category=result.getString(8);
String material=result.getString(9);
String color=result.getString(10);
String size=result.getString(11);
String brand=result.getString(12);
String area=result.getString(13);
int sale_volume=result.getInt(14);
v.add(man_id);
v.add(com_id);
v.add(name);
v.add(img);
v.add(cur_price);
v.add(raw_price);
v.add(discount);
v.add(category);
v.add(material);
v.add(color);
v.add(size);
v.add(brand);
v.add(area);
v.add(sale_volume);
data.add(v);
}
(2)图片渲染类
package softwork;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class ImageRenderer implements TableCellRenderer
{
@SuppressWarnings("unchecked")
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int rowIndex, int columnIndex) {
if( value instanceof Image ){
JLabel jLabel = new JLabel();
jLabel.setLayout(new BorderLayout());//设置布局
jLabel.setIcon(new ImageIcon((Image)value));//给jlable设置图片
return jLabel;
}
else if( value instanceof File ) {
try {
return new JLabel(new ImageIcon(ImageIO.read((File)value)));
} catch(IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
else {
String val = String.valueOf(value);
try {
return new JLabel(new ImageIcon(ImageIO.read(new File(val))));
} catch(IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
}
}
(3)用户界面类
//前面是界面设计,这里主要是图片显示在每行的第4列单元格中。
//注意getColumn(n)中n要与图片位置相对应,getColumn()是从0开始滴!
for(int i=0;i<data.size();i++){
tableModel.addRow(data.get(i));
}
this.table=new JTable(tableModel);
table.getColumnModel().getColumn(3).setCellRenderer(new ImageRenderer());//渲染图片
this.table.setRowHeight(50);
(4)效果
PS:希望大佬们多指教指教^ - ^ ~