TEL:400-8793-956
当前位置:程序、服务器

图像从数据库到jtable

提问者: 近期获赞: 浏览人数: 发布时间:2021-01-14 13:44:16

 问:我有一个应用程序,其中包含使用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?
上一篇: Java Arraylist循环问题
下一篇: 除了百度统计您还找到哪种工具最适合网站分析?