【问题标题】:Display image in table在表格中显示图像
【发布时间】:2013-07-17 23:08:00
【问题描述】:

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

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

【问题讨论】:

    标签: javafx-2 javafx tableview


    【解决方案1】:

    导致异常的问题是您的方法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));
    

    【讨论】:

    • 尝试在一个已经有文本列的表中也显示一个 blob 字段,但从未调用过 updateItem
    • a) 方法updateItem的签名错误;项目类型是第二个类型参数(您是否缺少@Override 注释?)b)您应该将图像设置为null,如果没有要显示的Image,否则图像永远不会被删除,如果项目将从表中删除,并且对Image 的引用仍保留在内存中,因为您在ImageView 中保留了引用(防止垃圾收集)。 c) 可能ImageView 应该成为TableCell 的一个字段;这种分组更合乎逻辑,可以更轻松地重构/重用代码。
    【解决方案2】:
    1. 为什么不直接从数据中创建图像 new Image(new ByteArrayInputStream(data)) 我们使用 Swing 的东西不需要重新包装它
    2. 我在 FX8 中看不到公共 Image(Object) 构造函数 - 如果您已经有图像实例,为什么还要传递它?
    3. 您需要使用 setGraphic() 在单元格上设置 ImageView

    【讨论】:

    • 你能告诉我一些如何解决它的例子吗?因为我对它还不是很熟悉
    • 喂?可以回复一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2015-05-28
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多