图像未使用 JavaFx 和场景生成器从数据库加载到 ImageView

问题描述 投票:0回答:1

这是我的TodaysMenu 模型 课程。

package hbh.helabojunhala.Model.Dashboard;

import hbh.helabojunhala.DatabaseConnection.DatabaseConnection;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.util.ArrayList;
import java.util.List;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TodaysMenuModel {

private Connection connection;

public TodaysMenuModel() {
    connection = DatabaseConnection.getConnection();
}

public List<String> getItemCodes() {
    List<String> itemCodes = new ArrayList<>();

    try {
        PreparedStatement preparedStatement = connection.prepareStatement("SELECT itemCode FROM items");
        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()) {
            itemCodes.add(resultSet.getString(1));
        }

        preparedStatement.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }

    return itemCodes;
}

public void getItemDetails(String itemCode, ImageView imageBox, TextField itemNameTxt) {
    try {
        PreparedStatement preparedStatement = connection.prepareStatement("SELECT itemName, itemImage FROM items WHERE itemCode = ?");
        preparedStatement.setString(1, itemCode);
        ResultSet resultSet = preparedStatement.executeQuery();

        if (resultSet.next()) {
            itemNameTxt.setText(resultSet.getString(1));
            Image image = new Image(resultSet.getBinaryStream(2));
            imageBox.setImage(image);
        }

        preparedStatement.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

这是我的TodaysMenuController控制器

package hbh.helabojunhala.Controller.Dashboard;


import hbh.helabojunhala.Model.Dashboard.TodaysMenuModel;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;

import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

public class TodaysMenuController implements Initializable {

    @FXML
    private ComboBox<String> itemCodeCombo;
    @FXML
    private TextField itemNameTxt;
    @FXML
    private ImageView imageBox;

    private TodaysMenuModel model;

    public TodaysMenuController() {
        model = new TodaysMenuModel();
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        List<String> itemCodes = model.getItemCodes();
        itemCodeCombo.getItems().addAll(itemCodes.toArray(new String[0]));
    }

    @FXML
    public void itemCodeComboOnAction() {
        String selectedItemCode = itemCodeCombo.getValue();
        model.getItemDetails(selectedItemCode, imageBox, itemNameTxt);
    }
}

我想将图像从数据库加载到应用程序中的 ImageView 中。当我在组合框中选择项目时,数据显示在字段中但不加载图像。并且没有显示任何错误。

还在我的数据库表中,我使用数据类型“longblob”来存储图像。图像存储在表中。另外,当我尝试从数据库下载图像时,另一件事是下载为 .bin 文件

有人可以帮我解决这个问题吗?欣赏它。谢谢你。

补充

这是我将图像存储在数据库表中的方式。

private static byte[] imageToBytes(Image image) {
        if (image == null) {
            return null;
        }

        // Convert Image to WritableImage
        PixelReader pixelReader = image.getPixelReader();
        if (pixelReader == null) {
            System.err.println("Failed to get PixelReader from the image.");
            return null;
        }

        int width = (int) image.getWidth();
        int height = (int) image.getHeight();

        try {
            WritableImage writableImage = new WritableImage(pixelReader, width, height);

            // Get pixel data from WritableImage
            byte[] buffer = new byte[width * height * 4]; // Assuming the image is in ARGB format (4 bytes per pixel)
            ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);

            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    int pixel = writableImage.getPixelReader().getArgb(x, y);
                    byteBuffer.putInt(pixel);
                }
            }

            // Assuming 'maxSize' is the maximum allowed size for the 'itemImage' column
            int maxSize = 1024000; // Adjust this value based on your database configuration

            int actualSize = Math.min(byteBuffer.position(), maxSize);

            byte[] resizedBuffer = Arrays.copyOf(buffer, actualSize);
            return resizedBuffer;
        } catch (Exception e) {
            // Handle exceptions during image conversion
            System.err.println("Error converting image to byte array: " + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
java maven javafx scenebuilder
1个回答
0
投票

如果您的图像未使用 Scene Builder 从数据库加载到 JavaFX 中的 ImageView,您可以检查以下几项内容:

数据库检索: 确保您从数据库中正确检索图像。检查您的数据库检索代码,确保您获得了预期的图像数据。

图像格式: 验证 JavaFX 是否支持图像格式。一般支持 PNG、JPG、GIF 等常见格式。

正确的数据绑定: 确认您已将检索到的图像数据正确绑定到 ImageView。检查您的代码以确保 Image 对象已创建并在 ImageView 上正确设置。

JavaFX 应用程序线程上的 UI 更新: 确保任何 UI 更新(包括在 ImageView 上设置图像)都在 JavaFX 应用程序线程上执行。如果需要,您可以使用 Platform.runLater() 来实现此目的。

正确的图像路径或流: 如果您使用 Image 类加载图像,请确保提供正确的路径或输入流。如果图像存储为字节数组,请使用 ByteArrayInputStream 创建图像。

尺寸和能见度: 检查 ImageView 是否具有适当的大小和可见性设置。它应该足够大以显示图像,并且其可见性应设置为 true。

错误处理: 实施错误处理以捕获图像加载期间可能发生的任何异常。这可以帮助您确定具体问题。

调试: 使用调试工具在运行时检查这些值。这可以帮助您确定问题发生的位置。

如果您提供更多详细信息或代码片段,我可以提供更具体的帮助

© www.soinside.com 2019 - 2024. All rights reserved.