2013-07-17 4 views
1

Я пытаюсь вставить изображение в таблицу в JavafX. Вот как я настроил свой вид таблицы:Показать изображение в таблице

TableColumn prodImageCol = new TableColumn("IMAGES"); 
    prodImageCol.setCellValueFactory(new PropertyValueFactory<Product, Image>("prodImage")); 
    prodImageCol.setMinWidth(100); 
    // setting cell factory for product image   
    prodImageCol.setCellFactory(new Callback<TableColumn<Product,Image>,TableCell<Product,Image>>(){   
     @Override 
     public TableCell<Product,Image> call(TableColumn<Product,Image> param) {     
      TableCell<Product,Image> cell = new TableCell<Product,Image>(){ 
        public void updateItem(Product item, boolean empty) {       
        if(item!=null){        
         ImageView imageview = new ImageView(); 
         imageview.setFitHeight(50); 
         imageview.setFitWidth(50); 
         imageview.setImage(new Image(product.getImage())); 
        } 
       } 
      }; 
      return cell; 
     } 

    });   

viewProduct.setEditable(false); 
viewProduct.getColumns().addAll(prodImageCol, prodIDCol, prodNameCol, prodDescCol, prodPriceCol, col_action); 
viewProduct.getItems().setAll(product.populateProductTable(category)); 

private SimpleObjectProperty prodImage; 

public void setprodImage(Image value) { 
    prodImageProperty().set(value); 
} 

public Object getprodImage() { 
    return prodImageProperty().get(); 
} 

public SimpleObjectProperty prodImageProperty() { 
    if (prodImage == null) { 
     prodImage = new SimpleObjectProperty(this, "prodImage"); 
    } 
    return prodImage; 
} 

И это, как я получить изображение из базы данных:

Blob blob = rs.getBlob("productImage"); 
byte[] data = blob.getBytes(1, (int) blob.length()); 
bufferedImg = ImageIO.read(new ByteArrayInputStream(data)); 
image = SwingFXUtils.toFXImage(bufferedImg, null); 

Однако я получаю сообщение об ошибке при настройке вида таблицы: ImageView. setImage (новое изображение (product.getImage())); сообщение об ошибке, как:

no suitable constructor found for Image(Image) 
constructor Image.Image(String,InputStream,double,double,boolean,boolean,boolean) is not applicable 
    (actual and formal argument lists differ in length) 
constructor Image.Image(int,int) is not applicable 
    (actual and formal argument lists differ in length) 
constructor Image.Image(InputStream,double,double,boolean,boolean) is not applicable 
    (actual and formal argument lists differ in length) 
constructor Image.Image(InputStream) is not applicable 
    (actual argument Image cannot be converted to InputStream by method invocation conversion) 
constructor Image.Image(String,double,double,boolean,boolean,boolean) is not applicable 
    (actual and formal argument lists differ in length) 
constructor Image.Image(String,double,double,boolean,boolean) is not applicab... 

я сумел получить и отобразить изображение внутри зрения изображения, но тем не менее, я не могу отобразить его в столбце таблицы. Любая помощь будет оценена по достоинству. Заранее спасибо.

ответ

3

Проблема, которая вызывает исключение в том, что ваш метод product.getImage() возвращается в javafx.scene.Image. На данный момент не нужно ничего делать: у вас есть изображение, поэтому используйте его (прежде чем пытаться построить new Image(Image) - что даже не возможно). Это то, что вы хотите использовать:

imageview.setImage(product.getImage()); 

Ваша вторая проблема заключается в том, что в то время как вы создаете ImageView каждый раз, когда вы обновляете ячейку, вы не ничего с ним делать. Вот исходный код:

 TableCell<Product,Image> cell = new TableCell<Product,Image>(){ 
       public void updateItem(Product item, boolean empty) {       
       if(item!=null){        
        ImageView imageview = new ImageView(); 
        imageview.setFitHeight(50); 
        imageview.setFitWidth(50); 
        imageview.setImage(new Image(product.getImage())); 
       } 
      } 
     }; 
     return cell; 

Как @tomsontom предложил, я бы рекомендовал использовать setGraphic(Node), чтобы прикрепить ImageView к TableCell. Таким образом, вы могли бы в конечном итоге с чем-то вроде этого:

 //Set up the ImageView 
     final ImageView imageview = new ImageView(); 
     imageview.setFitHeight(50); 
     imageview.setFitWidth(50); 

     //Set up the Table 
     TableCell<Product,Image> cell = new TableCell<Product,Image>(){ 
       public void updateItem(Product item, boolean empty) {       
       if(item!=null){ 
        imageview.setImage(product.getImage()); //Change suggested earlier 
       } 
      } 
     }; 

     // Attach the imageview to the cell 
     cell.setGraphic(imageview) 
     return cell; 

Первый пункт @tomsontom делал, что ваш метод создания изображения немного окольным. Конечно, это работает ... но есть более простой способ. Первоначально вы использовали:

bufferedImg = ImageIO.read(new ByteArrayInputStream(data)); 
image = SwingFXUtils.toFXImage(bufferedImg, null); 

, но лучший способ сделать это было бы переключение этих линий с:

image = new Image(new ByteArrayInputStream(data)); 
+0

Пробовал это в таблице, в которой уже были текстовые столбцы, для отображения поля blob тоже, и 'updateItem' никогда не вызывался. – ajeh

+0

a) подпись метода 'updateItem' неверна; тип элемента - это параметр второго типа (вы не замечаете аннотацию '@ Override'?). b) вы должны установить изображение в значение« null », если изображение« Изображение »не отображается, поскольку в противном случае изображение никогда не удаляется, если элементы удалены из таблицы, а также ссылки на «Изображение» остаются в памяти, так как вы сохраняете ссылку в «ImageView» (предотвращает сбор мусора).c) вероятно, «ImageView» должен быть полем «TableCell»; эта группировка более логична и позволяет более легко преломлять/повторно использовать код. – fabian

2
  1. почему не не создавать изображения непосредственно из данных нового изображения (новый ByteArrayInputStream (данные)) нет необходимости заверните его наше использование Свинга вещь
  2. Я не вижу имидж (Object)-конструктор FX8 - зачем передавать его, если у вас уже есть экземпляр изображения?
  3. вам нужно установить ImageView на ячейку с setGraphic()
+0

Можете ли вы показать мне пример того, как ее решить? Потому что я до сих пор не так хорошо знаком –

+0

Привет? Можете ли вы ответить? –