【问题标题】:not all Blob images shows in jpanel并非所有 Blob 图像都显示在 jpanel 中
【发布时间】:2017-08-30 12:11:18
【问题描述】:

我在 derby blob 列中插入了 3 个 blob(图像)……第一次插入一个 blob,然后其他条目插入了 2 个 blob……插入一行的 blob。

blob.getLength() ,为我提供 3 个 blob( 图像) 组合的确切字节大小,这表明这 3 个 blob 已保存在 DB 中。

然后我尝试获取:

byteArray = blob.getBytes(0,blob.length());
imageIcon=new ImageIcon(byteArray);

或者

inputStream =blob.getBinaryStream();
BufferedImage image=ImageIO.read(inputStream);
imageIcon= new ImageIcon(image);

无论我使用哪个,我都只会在 Jpanel 上看到第一个 blob(图像)… 是什么阻止了其他 blob 被读取和显示?

private JTextPane createMediaArea() {
    String getMediaEditorData = "select mediaEditor from settingsTable where id=6";
    Statement stmtBlob;
    try {
        stmtBlob = settingsConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        try (ResultSet rsMediaEditor = stmtBlob.executeQuery(getMediaEditorData)) {
            System.out.println("rsMediaEditor is created ");

            while (rsMediaEditor.next()) {
                mediaEditorBlob = rsMediaEditor.getBlob("mediaEditor");
                if (mediaEditorBlob == null) {
                    chosenImageIcon = new ImageIcon("./resources.jpg");
                    scaledChosenImage = chosenImageIcon.getImage().getScaledInstance(100, 100, Image.SCALE_FAST);
                    scaledImageIcon = new ImageIcon(scaledChosenImage);
                    mediaArea.insertIcon(scaledImageIcon);
                } else {
                    mediaEditorBlobLength = mediaEditorBlob.length();
                    System.out.println("mediaEditorBlobLength is : " + mediaEditorBlobLength);
                    /*1st way is to get the blob array .*/
                    /*
                    byte[] mediaEditorByteArray = mediaEditorBlob.getBytes(1L, (int) mediaEditorBlobLength);
                    int mediaEditorByteArrayLength = mediaEditorByteArray.length;
                    System.out.println("mediaEditorByteArrayLength is :" + mediaEditorByteArrayLength);
                    */


                    /*2nd way ..use ImageIO*/
                    InputStream binaryStream = mediaEditorBlob.getBinaryStream();
                    BufferedImage read = ImageIO.read(binaryStream);

                    chosenImageIcon= new ImageIcon(read);

                    scaledChosenImage = chosenImageIcon.getImage().getScaledInstance(100, 100, Image.SCALE_FAST);

                    scaledImageIcon = new ImageIcon(scaledChosenImage);

                    mediaArea.insertIcon(scaledImageIcon);

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(FrontFace.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("rsMediaEditor closed !");
        stmtBlob.close();
        System.out.println("stmtBlob closed !");
    } catch (SQLException ex) {
        Logger.getLogger(FrontFace.class.getName()).log(Level.SEVERE, null, ex);
    }
    return mediaArea;
}

【问题讨论】:

  • 如果您创建一个 ImageIcon 怎么能期望绘制 3 个图标。你能发布可运行的短代码吗?
  • @Jay Smith....所有 3 个 blob 都插入并驻留在列的一行中.... inputStream 或 byteArray 是否收集行中可用的所有字节...或的一部分?
  • 您将一张图像存储在位置列*行。在 1*1 有一个图像,但在 1*2 有另一个图像。同一列但不同的行
  • @Jay Smith ...在同一列中创建多行是我在过去几天试图弄清楚的事情..到目前为止没有运气:) 找不到正确的方法this....in 接口 Blob & ResultSet ...(这迫使我使用 ByteArrayOutputStream 在一行中插入多个 blob)

标签: java arrays blob inputstream imageicon


【解决方案1】:

在 java 中,我们使用 jdbc 与数据库进行交互。有关示例,请参见此处https://docs.oracle.com/javase/tutorial/jdbc/

而 jdbc 用于将数据库行检索到 java 对象中。

【讨论】:

  • ...感谢链接...。这部分可能有一个解决方案..“使用 JdbcRowSet 对象” ....
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多