2017-05-23 12 views
1

私はこの解決策を見つけるのが苦労しているので、私は質問を書き直しています。名前、姓などを知っている生徒の基本情報を登録する簡単なフォームを作った。また、ファイルチェッカークラスで写真を選択して、ファイルシステムから画像を見つけることもできます。バイト配列をjavaFXイメージに変換するには?

このコードを見てみましょう。

ユーザーがボタンをクリックしたとき、彼らは私が がinputreamオブジェクトである変数であることを新しいのFileInputStreamと参照を作成し、その後 を画像を選択します。この時点で
@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); 
    } 

} 

。それはいくつかのものをやってされる次のこのメソッドが呼び出され、currentStudent変数は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(); 
      } 
     } 

。 Everithingは生徒objが保存されるのに完璧です。あなたは、私がPreparedStatementオブジェクトにそのinpustream変数を渡していますし、それはokです見ることができるように

ここ

は、新しい学生を保存する方法

@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(); 
    } 
} 

ですが、私はデータが存在するデータベースで確認してください。しかし、私はこのレコードをデータベースから持ってくると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で、データベース上に画像のバイトがあるため、私は何の手がかりもありません。私はバイトを取得する別の方法を作って、生徒オブジェクトがどこに作成されたかを管理しますが、うまくいきませんでした。誰かがこの問題の解決策を知っていれば、私は満足しています。この質問を読んでいただきありがとうございます。

+1

画像のエンコード方法によって... – fabian

+0

申し訳ありません。しかし、私はそれを得ていませんでした。私はJavaの初心者です。私にコードを教えてください。 – yfabio

+2

前のコメントに示されているように、結果セットから取得したバイナリデータにイメージがどのようにコード化されているかを知らなくても、これを行う方法は誰にも分かりません。そして、「うまくいきません」というのは問題の声明ではありません。 –

答えて

7

最初に次のコードを使用して画像にバイト配列を変換し、画像を描画する:

Image img = new Image(new ByteArrayInputStream(buffer)); 

その後graphicsContextdrawImage方法を使用します。

graphicsContext.drawImage(img, x, y, width, heighth); 

だから、私の提案は、画像を保存することはないが生徒のオブジェクトに

バイト配列プロパティを使用することができ、上記のように学生レコードをImageに変換するときに使用できます。

+0

私はそれを試してみましょう。ありがとうございました。 – yfabio

+1

正しいコードマークアップの使い方を学んでください。 (https:// stackoverflow。com/editing-help#code)これはあなたの答えのすべてで間違っています。 – fabian

関連する問題