在表格中显示图像

时间:2013-07-17 10:34:06

标签: javafx-2 javafx tableview

我正在尝试将图像插入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(new Image(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...

我确实设法检索并在图像视图中显示图像,但是,我无法在表格列中显示它。任何帮助,将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分: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的第一点是你创建一个Image的方法有点迂回。当然,它似乎有效...但有一种更简单的方法。最初你使用的是:

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

但更好的方法是用以下方式切换这些行:

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

答案 1 :(得分:2)

  1. 为什么不直接从数据中创建Image new Image(new ByteArrayInputStream(data))不需要重新包装我们使用Swing的东西
  2. 我没有在FX8中看到公共的Image(对象)构造函数 - 为什么要传递它,如果你已经有了一个图像实例?
  3. 您需要使用setGraphic()
  4. 在单元格上设置ImageView