问:我有一个应用程序,其中包含使用java sql的数据库,并具有显示数据库信息的jTable。除了我尝试将图像存储和显示到其中一列之外,它的工作原理不错。我使用了jTable1.setModel(DbUtils.resultSetToTableModel(rec)); 显示到jtable的方法(带有rs2xml.jar文件)。我将图像作为BLOB存储到数据库中,我打算尝试使用文件路径方式,但是这很困难,我只想以最简单的方式使它尽快运行。
我已经尝试了一切,目前我做了一个单独的课,看起来像:
package JavaApplication29;
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
public class ImageRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected,boolean hasFocus, int row, int column)
{
JLabel label = new JLabel();
if (value!=null) {
label.setHorizontalAlignment(JLabel.CENTER);
label.setIcon(new ImageIcon((byte[])value));
}
return label;
}
}
并添加了以下代码行:
"jTable1.getColumnModel().getColumn(6).setCellRenderer(new ImageRenderer());"
to the action listener method. So this part of the code looks like:
DefaultTableModel model = new DefaultTableModel();
jTable1.setModel(model);
String sqlQuery = "select COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5 from APP.DATA123 "
+ "where (COLUMN1 = ?) AND (COLUMN2 = ?) AND (COLUMN3 = ?) OR (COLUMN2 = ?) AND (COLUMN3 = ?)";
String abc = jTextField2.getText();
String cba = (String)jComboBox1.getSelectedItem();
String cab = (String)jComboBox2.getSelectedItem();
String data = "jdbc:derby://localhost:1527/sample";
try (
Connection conn = DriverManager.getConnection(
data, "app", "app");
PreparedStatement st = conn.prepareStatement(sqlQuery)) {
Class.forName("org.apache.derby.jdbc.ClientDriver");
st.setString(1, abc);
st.setString(2, cba);
st.setString(3, cab);
st.setString(4, cba);
st.setString(5, cab);
ResultSet rec = st.executeQuery();
jTable1.getColumnModel().getColumn(6).setCellRenderer(new ImageRenderer());
jTable1.setModel(DbUtils.resultSetToTableModel(rec));
st.close();
} catch (SQLException s) {
System.out.println("SQL Error: " + s.toString() + " "
+ s.getErrorCode() + " " + s.getSQLState());
} catch (Exception e) {
System.out.println("Error: " + e.toString()
+ e.getMessage());
这以及我尝试过的许多其他事情都给了我拒绝
“错误:java.lang.ArrayIndexOutOfBoundsException:6> = 06> = 0”
我也试过
int i = jTable1.getSelectedRow();
ImageIcon image1 = (ImageIcon) jTable1.getValueAt(i, 6);
jTable1.setModel(DbUtils.resultSetToTableModel(rec));
以及其他一些方法.....
谁能指出我正确的方向,以便我继续前进?在此问题之前,我取得了如此巨大的进步。
答:您需要从数据库获取图像作为InputStream,如下所示:
//从数据库获取图像
InputStream GetImageFromDB = result2.getBinaryStream(“ Image”);
//创建不带文本的JLabel
JLabel图片=新的JLabel(“”);
//设置标签大小
image.setBounds(5,91,440,41);
//将InputStream转换为BufferedImage
BufferedImage im = ImageIO.read(GetImageFromDB);
//缩放图像
图片scaledImage = im.getScaledInstance(image.getWidth(),image.getHeight(),Image.SCALE_SMOOTH);
//将缩放后的图像转换为ImageIcon
ImageIcon图标=新的ImageIcon(scaledImage);
//设置标签图标
image.setIcon(icon);
//重新验证标签
image.revalidate();
答:我试图添加输入流,因此代码显示如下,对数字表示遗憾。
1. DefaultTableModel模型=新的DefaultTableModel();
2。
3. jTable1.setModel(model);
4。
5,
6。
7。
8。
9。
10。
11.字符串sqlQuery =“从APP.DATA123中选择COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5”
12
13. +“其中(COLUMN1 =?)AND(COLUMN2 =?)AND(COLUMN3 =?)OR(COLUMN2 =?)AND(COLUMN3 =?)”;
14。
15
16。
17。
18岁
19.字符串abc = jTextField2.getText();
20
21.字符串cba =(String)jComboBox1.getSelectedItem();
22
23.字符串cab =(String)jComboBox2.getSelectedItem();
24
25.字符串数据=“ jdbc:derby:// localhost:1527 / sample”;
26
27.尝试(
28。
29.连接conn = DriverManager.getConnection(
30岁
31. data,“ app”,“ app”);
32。
33. PreparedStatement st = conn.prepareStatement(sqlQuery)){
34。
35岁
36。
37。
38。
39。
1. Class.forName(“ org.apache.derby.jdbc.ClientDriver”);
1. st.setString(1,abc);
1. st.setString(2,cba);
1. st.setString(3,cab);
1. st.setString(4,cba);
1. st.setString(5,cab);
1. ResultSet rec = st.executeQuery();
2. InputStream Gettingimage = rec.getBinaryStream(“ Image”);
3. JLabel图片=新的JLabel(“”);
4. image.setBounds(5,91,440,41);
5. BufferedImage im = ImageIO.read(gettingimage);
6.图片scaledImage = im.getScaledInstance(image.getWidth(),
7. image.getHeight(),Image.SCALE_ SMOOTH);
8. ImageIcon图标= new ImageIcon(scaledImage);
9. image.setIcon(icon);
10. image.revalidate();
11. jTable1.getColumnModel()。getColumn(6).setCellRenderer(new ImageRenderer());
1. jTable1.setModel(DbUtils.resultSetToTableModel(rec));
1。
1. st.close();
1。
1.} catch(SQLException s){
1. System.out.println(“ SQL错误:” + s.toString()+“”
2. + s.getErrorCode()+“” + s.getSQLState());
1.}捕获(异常e){
1. System.out.println(“错误:” + e.toString()
2. + e.getMessage())
它声明的拒绝是“ java.sql.SQLException:当前光标位置处的无效操作。20000 XJ121”我保持其他类不变。
所以我应该保持
jTable1.getColumnModel()。getColumn(6).setCellRenderer(new ImageRenderer()); jTable1.setModel(DbUtils.resultSetToTableModel(rec));
相同?
所以您代码中的result2 =在我的模式下为rec?