我正在重写我的问题,因为我很难找到这个解决方案。我已经做了一个简单的表格来注册一些你知道姓名,姓氏等的学生的基本信息。它还可以选择filechooser类从文件系统中查找图片。
让我们来看看这段代码。
@FXML
public void onBrowserPhoto() throws IOException {
File file = fileChooser.showOpenDialog(stage);
if (file != null) {
is = new FileInputStream(file);
Image image = new Image(is);
imageView.setImage(image);
}
}
此时,当用户点击按钮时,他们将选择一张图片 我创建了一个新的fileInputStream并引用是变量,它是一个inputream对象。
private void businessOnSave() {
if (currentStudent.getId() == 0) {
try {
currentStudent.setIs(is);
currentStudent
.setGenger(buttonMale.isSelected() == true ? buttonMale.getText() : buttonFemale.getText());
if (!checkStudent(currentStudent)) {
service.saveStudent(currentStudent);
studentUnBind(currentStudent);
sweep();
listView.getItems().add(currentStudent.getNickname());
buttonNew.disableProperty().setValue(false);
is.close();
} else {
return;
}
} catch (ServiceException | IOException e) {
e.printStackTrace();
}
}
当使用点击保存按钮时,将调用此方法并且currentStudent变量接收该输入流(是)接下来它将执行一些操作然后我使用服务对象保存它。 Everithing是完美的学生obj得救。
以下是保存新学生的方法
@Override
public void save(Student t) throws SQLException {
try (PreparedStatement ps = con.prepareStatement(INSERT)) {
ps.setString(1, t.getNickname());
ps.setString(2, t.getLastName());
ps.setString(3, t.getEmail());
ps.setString(4, t.getPhone());
ps.setString(5, t.getGenger());
ps.setDate(6, Date.valueOf(t.getBirthDate()));
ps.setBinaryStream(7, t.getIs());
ps.executeUpdate();
}
}
正如您所看到的,我将该inpustream变量传递给preparedStatement对象,并且没关系,我在数据库中确认数据存在。但是当我从数据库中提取此记录时,它不会在UI上显示图像。
这是从该基地返回学生记录的方法。
public Student getStudentByName(String name) throws SQLException {
Student student = new Student();
try (PreparedStatement ps = con.prepareStatement(GET_STUDENT_BY_NAME)) {
ps.setString(1, name);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
student.setId(rs.getInt("student_id"));
student.setNickname(rs.getString("nickname"));
student.setLastName(rs.getString("lastname"));
student.setEmail(rs.getString("email"));
student.setPhone(rs.getString("phone"));
student.setGenger(rs.getString("genger"));
student.setBirthDate(rs.getDate("birthdate").toLocalDate());
try(InputStream is = rs.getBinaryStream("photo")){
BufferedImage bg = ImageIO.read(is);
if(bg != null){
Image image = SwingFXUtils.toFXImage(bg, null);
student.setPhoto(image);
}
} catch (IOException e) {
e.printStackTrace(); }
}
}
}
return student;
}
bg objec为null,我不知道为什么因为在数据库上有图像字节。我已经采用另一种方法来获取字节,然后处理学生对象的创建位置,但它不能正常工作。如果有人知道这个问题的解决方案,我会很高兴。感谢您抽出宝贵时间阅读此问题。
答案 0 :(得分:14)
要绘制图像,首先使用以下代码将字节数组转换为Image:
Image img = new Image(new ByteArrayInputStream(buffer));
然后使用drawImage
的{{1}}方法:
graphicsContext
所以我的建议是不要将Image存储在学生对象中。
您可以使用字节数组属性,当您将学生记录转换为Image时,如上所述。