2017-01-22 1 views
0

Я работаю над приложением электронной коммерции с использованием JavaFX, я использую SQL Server 2014, и мне не удалось получить изображение из базы данных. Я использую цикл for, чтобы добавить все значения базы данных на панели сетки. Предполагалось, что изображение находится в центре сетки с названием продукта и ценой внизу. Я получаю исключение java.lang.NullPointerException каждый раз, когда я его пробовал. Может кто-нибудь, пожалуйста, помогите мне?javafx получить изображение из базы данных sql server

BorderPane background[]= new BorderPane[13]; 

     Label productName[]= new Label[13]; 
     Label priceLable[]= new Label[13]; 
     Image image; 
     ImageView imageView; 

    for (int i = 0; i<=12;i++){ 
     background[i]=new BorderPane(); 
     background[i].setStyle("-fx-background-color: rgb(216, 216, 216)"); 
     background[i].setPrefHeight(300); 
     background[i].setPrefWidth(250); 

     try { 

       String query = "select pname,price,manufacturer,pimg from Adulis_product where pid=?"; 
       pst = con.prepareStatement(query); 
       pst.setInt(1, adp.getProduct_id()); 

       rs = pst.executeQuery(); 

       while (rs.next()) { 

        productName[i]=new Label(rs.getString("pname")+" - "+rs.getString("manufacturer")); 
        productName[i].setStyle("-fx-text-fill: #282828"); 
        productName[i].setFont(Font.font(" sans-serif", FontWeight.EXTRA_BOLD,14)); 

        priceLable[i]= new Label(rs.getString("price")); 
        priceLable[i].setStyle("-fx-text-fill: #1da288"); 
        priceLable[i].setFont(Font.font(" sans-serif", FontWeight.EXTRA_BOLD,15)); 
        int finalI2 = i; 

        InputStream is = rs.getBinaryStream("pimg"); 
        OutputStream os= new FileOutputStream(new File("pic.jpg")); 
        byte[] content= new byte[1024]; 
        int size=0; 
        while((size = is.read(content))!=-1){ 

         os.write(content, 0,size); 
        } 
        os.close(); 
        is.close(); 
        image = new Image("file:pic"+i+".jpg", 250,300,false,true); 

        imageView = new ImageView(image); 
        imageView.setFitHeight(300); 
        imageView.setFitWidth(250); 


        VBox prceNmanufactue= new VBox(10); 
        prceNmanufactue.getChildren().addAll(productName[i],priceLable[i]); 
        prceNmanufactue.setPadding(new Insets(0,0,0,5)); 

        Image newp= new Image(getClass().getResourceAsStream("New_30px.png")); 
        ImageView newimv= new ImageView(newp); 

        background[i].setTop(newimv); 

        VBox borderElements= new VBox(5); 
        borderElements.getChildren().addAll(prceNmanufactue,addtocart[i]); 
        background[i].setBottom(borderElements); 

       } 
      } catch (Exception e1) { 
       System.out.println(e1); 
      } 
+0

Пожалуйста, задайте вопрос, чтобы включить трассировку стека, и укажите, какая строка в коде выбрала исключение. –

+0

Я уже исправил исключение Java. Сообщение об ошибке исчезло сразу после ввода изображений в базу данных. но по-прежнему не удается получить изображения из базы данных. – ben

+0

Вот код, который я использовал для извлечения изображений. – ben

ответ

0

Вы пишете данные изображения в файл с именем файла pic.jpg:

InputStream is = rs.getBinaryStream("pimg"); 
OutputStream os= new FileOutputStream(new File("pic.jpg")); 
byte[] content= new byte[1024]; 
int size=0; 
while((size = is.read(content))!=-1){ 

    os.write(content, 0,size); 
} 

, а затем пытается прочитать из файла с другим именем:

image = new Image("file:pic"+i+".jpg", 250,300,false,true); 

Так предположительно вы предназначенные для использования

OutputStream os= new FileOutputStream(new File("pic"+i+".jpg")); 

Копирование всех данных в файл, чтобы прочитать его обратно, невероятно неэффективно. Вам действительно нужен файл? Почему бы просто не сделать

InputStream is = rs.getBinaryStream("pimg"); 
image = new Image(is, 250,300,false,true); 

Вы также, кажется, не делать ничего с этой точки зрения изображения, так что вам нужно, чтобы добавить его в какой-то области где-то.

Смежные вопросы