【问题标题】:Java FX image display on search query搜索查询中的 Java FX 图像显示
【发布时间】:2020-06-16 23:18:06
【问题描述】:

我最近正在使用 blob 图像上传图像,它可以工作 但是现在当我尝试在搜索中搜索特定的人时,它没有出现 我试图将 blob 图像转换为字节并以 java fx 形式显示在图像字段中

这是我的代码

 @FXML
    private void handleSearchResults(KeyEvent event) throws IOException {

        try {

            String sql = "select * from Staff_information where id=? ";
            pst = conn.prepareStatement(sql);
            pst.setString(1, txtSearch.getText());
            rs = pst.executeQuery();

            String add1 = rs.getString("id");
            txtid.setText(add1);

            byte[] img = rs.getBytes("Image");
            BufferedImage bufferedImage = ImageIO.read(img);
            WritableImage image = SwingFXUtils.toFXImage(bufferedImage, null);

            imageDisplay.setImage(image);
            imageDisplay.setFitWidth(200);
            imageDisplay.setFitHeight(200);


        } catch (Exception e) {
            System.out.println("missingdata");
        } finally {

            try {

                rs.close();
                pst.close();

            } catch (Exception e) {

            }
        }

    }

这是我的文件上传代码

文件上传

 @FXML
    private void UploadImageActionPerformed(ActionEvent event) {

        FileChooser fileChooser = new FileChooser();

        //Set extension filter
        FileChooser.ExtensionFilter extFilterJPG
                = new FileChooser.ExtensionFilter("JPG files (*.JPG)", "*.JPG");
        FileChooser.ExtensionFilter extFilterjpg
                = new FileChooser.ExtensionFilter("jpg files (*.jpg)", "*.jpg");
        FileChooser.ExtensionFilter extFilterPNG
                = new FileChooser.ExtensionFilter("PNG files (*.PNG)", "*.PNG");
        FileChooser.ExtensionFilter extFilterpng
                = new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
        fileChooser.getExtensionFilters()
                .addAll(extFilterJPG, extFilterjpg, extFilterPNG, extFilterpng);
        //Show open file dialog
        File file = fileChooser.showOpenDialog(null);

        try {
            BufferedImage bufferedImage = ImageIO.read(file);
            WritableImage image = SwingFXUtils.toFXImage(bufferedImage, null);
            img.setImage(image);
            img.setFitWidth(200);
            img.setFitHeight(200);
            img.scaleXProperty();
            img.scaleYProperty();
            img.setSmooth(true);
            img.setCache(true);
            FileInputStream fin = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];

            for (int readNum; (readNum = fin.read(buf)) != -1;) {
                bos.write(buf, 0, readNum);
            }
            person_image = bos.toByteArray();

        } catch (IOException ex) {
            Logger.getLogger("ss");
        }
    }


byte[] person_image = null;

 @FXML
    private void handleaddemployee(ActionEvent event) throws IOException {

        try {
                String empID = "nill";
                if (!txtempID.getText().equals("")) {
                    empID = txtempID.getText();
                }

                Employee e = new Employee(
                        empID,
                        person_image 
                );
                dbemployee.addEmployee(e);

            } else {
                 System.out.println("not working");
            }

        } catch (SQLException ex) {
           System.out.println("error");

        } catch (NumberFormatException e) {
         System.out.println("number error");

        }

    }

为了验证我尝试了从数据库中读取的第一个字段,结果为“2”测试数据 但是员工“2”的图像没有加载和崩溃

任何帮助将不胜感激 谢谢你

错误

错误

【问题讨论】:

  • “崩溃”是什么意思?

标签: java javafx blob


【解决方案1】:

ResultSet 中的光标(指向当前行的指针)最初指向第一行之前next() 方法返回一个布尔值,指示是否有更多行要移动,如果有则移动到下一行。

在您发布的代码中,您从不调用rs.next(),因此当您尝试检索 id 和图像时,光标未指向任何行,并且(我认为)抛出异常。

在您的情况下,由于您正在搜索似乎是主键的内容,因此您期望返回零或一行。所以你需要:

private void handleSearchResults(KeyEvent event) throws IOException {

    try {

        String sql = "select * from Staff_information where id=? ";
        pst = conn.prepareStatement(sql);
        pst.setString(1, txtSearch.getText());
        rs = pst.executeQuery();

        if (rs.next()) {
            String add1 = rs.getString("id");
            txtid.setText(add1);

            byte[] img = rs.getBytes("Image");
            BufferedImage bufferedImage = ImageIO.read(img);
            WritableImage image = SwingFXUtils.toFXImage(bufferedImage, null);

            imageDisplay.setImage(image);
            imageDisplay.setFitWidth(200);
            imageDisplay.setFitHeight(200);
        } else {
            // no match found.... inform user, etc
        }

    } catch (Exception e) {
        System.out.println("missingdata");
    } finally {

        try {

            rs.close();
            pst.close();

        } catch (Exception e) {

        }
    }

}

【讨论】:

  • 是的,你是对的,但是显示图像的代码不起作用,你能帮我解决这个问题吗
  • @shafeensulaiman 实际发生了什么?你有例外吗?如果是这样,打印堆栈跟踪(不仅仅是一条消息),并在问题中显示完整的堆栈跟踪。确定哪一行引发了异常。
  • 我已经用两张图片更新了我的问题,请您检查一下并帮助我
  • @shafeen 您的imgbyte[],但有no ImageIO#read(...) method 接受byte[] 参数。但是,有一个ImageIO#read(InputStream) 方法。见ByteArrayInputStream
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 2022-07-01
  • 2010-11-24
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多