这是我的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;
}
}
如果您的图像未使用 Scene Builder 从数据库加载到 JavaFX 中的 ImageView,您可以检查以下几项内容:
数据库检索: 确保您从数据库中正确检索图像。检查您的数据库检索代码,确保您获得了预期的图像数据。
图像格式: 验证 JavaFX 是否支持图像格式。一般支持 PNG、JPG、GIF 等常见格式。
正确的数据绑定: 确认您已将检索到的图像数据正确绑定到 ImageView。检查您的代码以确保 Image 对象已创建并在 ImageView 上正确设置。
JavaFX 应用程序线程上的 UI 更新: 确保任何 UI 更新(包括在 ImageView 上设置图像)都在 JavaFX 应用程序线程上执行。如果需要,您可以使用 Platform.runLater() 来实现此目的。
正确的图像路径或流: 如果您使用 Image 类加载图像,请确保提供正确的路径或输入流。如果图像存储为字节数组,请使用 ByteArrayInputStream 创建图像。
尺寸和能见度: 检查 ImageView 是否具有适当的大小和可见性设置。它应该足够大以显示图像,并且其可见性应设置为 true。
错误处理: 实施错误处理以捕获图像加载期间可能发生的任何异常。这可以帮助您确定具体问题。
调试: 使用调试工具在运行时检查这些值。这可以帮助您确定问题发生的位置。
如果您提供更多详细信息或代码片段,我可以提供更具体的帮助