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(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...

画像ビュー内の画像を取得して表示することはできましたが、表の列に表示することはできません。どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

3

例外の原因となっている問題は、メソッドproduct.getImage()javafx.scene.Image. この時点で他に何もする必要はありません: 画像があるので、それを使用してください (構築しようとする前にnew Image(Image)- これは不可能です)。これはあなたが使いたいものです:

imageview.setImage(product.getImage());

2 番目の問題は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));
于 2013-07-17T14:49:00.243 に答える
2
  1. データから直接画像を作成しないのはなぜですか new Image(new ByteArrayInputStream(data)) 再ラップする必要はありません
  2. FX8 に public Image(Object) コンストラクターが表示されません。既にイメージ インスタンスがあるのに、なぜそれを渡す必要があるのでしょうか。
  3. setGraphic() でセルに ImageView を設定する必要があります
于 2013-07-17T11:00:34.300 に答える