Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为呈现为SimpleObject属性的JavaFX TableView列定义自定义比较器<;ImageView>;_Java_Javafx - Fatal编程技术网

为呈现为SimpleObject属性的JavaFX TableView列定义自定义比较器<;ImageView>;

为呈现为SimpleObject属性的JavaFX TableView列定义自定义比较器<;ImageView>;,java,javafx,Java,Javafx,我有一个表,它有不同的列,我想添加一个自定义构造器的表的签名如下: @FXML private TableColumn<Media,SimpleObjectProperty<ImageView>> hasBeenPlayed; 我应该使用lambda表达式来表示上述内容,我以这种方式添加它是为了更清楚地了解我要实现的目标 我得到的错误是 Exception in thread "JavaFX Application Thread" java.lan

我有一个表,它有不同的列,我想添加一个自定义构造器的表的签名如下:

@FXML
private TableColumn<Media,SimpleObjectProperty<ImageView>> hasBeenPlayed;
我应该使用lambda表达式来表示上述内容,我以这种方式添加它是为了更清楚地了解我要实现的目标


我得到的错误是

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException:
  javafx.scene.image.ImageView cannot be cast to javafx.beans.property.SimpleObjectProperty





正如詹姆斯在评论中要求的那样:

单元值工厂:

hasBeenPlayed.setCellValueFactory(new PropertyValueFactory<>("hasBeenPlayed"));

}您的代码存在多个问题

首先,将UI元素放在item类中,这是应该避免的。列的名称提示显示的属性只有两种状态。布尔属性更合适

使用自定义的
cellFactory
显示图像

此外,根据错误消息,列的实际类型应为
TableColumn

此外,您将比较器设置为非对称,这违反了比较器的合同

您必须确保满足以下要求:

如果
comparator.compare(a,b)<0
,则
comparator.compare(b,a)>0
。在您的情况下,除非所有
ImageView
s包含相同的图像(或所有包含
null
),否则不满足此要求

除了将属性设置为布尔属性外,还可以像这样修改代码:

@FXML
private TableColumn<Media, Boolean> hasBeenPlayed;
或者

hasBeenPlayed.setComparator((v1, v2) -> -Boolean.compare(v1, v2));
并将以下内容添加到控制器的
初始化
方法中

final Image playedImage = new Image(...);

hasBeenPlayed.setCellFactory(col -> new TableCell<Media, Boolean>() {
    private final ImageView image = new ImageView();

    {
        setGraphic(image);
        image.setFitWidth(playedImage.getWidth());
        image.setFitHeight(playedImage.getHeight());
    }

    @Override
    protected void updateItem(Boolean item, boolean empty) {
         super.updateItem(item, empty);

         // set the image according to the played state
         image.setImage(item != null && item ? playedImage : null);
    }
});
final Image playedImage=新图像(…);
hasBeenPlayed.setCellFactory(col->newtableCell()){
私有最终ImageView图像=新ImageView();
{
设置图形(图像);
setFitWidth(playedImage.getWidth());
image.setFitHeight(playedImage.getHeight());
}
@凌驾
受保护的void updateItem(布尔项,布尔空){
super.updateItem(项,空);
//根据播放状态设置图像
image.setImage(item!=null&&item?playedImage:null);
}
});

您的代码存在多个问题

首先,将UI元素放在item类中,这是应该避免的。列的名称提示显示的属性只有两种状态。布尔属性更合适

使用自定义的
cellFactory
显示图像

此外,根据错误消息,列的实际类型应为
TableColumn

此外,您将比较器设置为非对称,这违反了比较器的合同

您必须确保满足以下要求:

如果
comparator.compare(a,b)<0
,则
comparator.compare(b,a)>0
。在您的情况下,除非所有
ImageView
s包含相同的图像(或所有包含
null
),否则不满足此要求

除了将属性设置为布尔属性外,还可以像这样修改代码:

@FXML
private TableColumn<Media, Boolean> hasBeenPlayed;
或者

hasBeenPlayed.setComparator((v1, v2) -> -Boolean.compare(v1, v2));
并将以下内容添加到控制器的
初始化
方法中

final Image playedImage = new Image(...);

hasBeenPlayed.setCellFactory(col -> new TableCell<Media, Boolean>() {
    private final ImageView image = new ImageView();

    {
        setGraphic(image);
        image.setFitWidth(playedImage.getWidth());
        image.setFitHeight(playedImage.getHeight());
    }

    @Override
    protected void updateItem(Boolean item, boolean empty) {
         super.updateItem(item, empty);

         // set the image according to the played state
         image.setImage(item != null && item ? playedImage : null);
    }
});
final Image playedImage=新图像(…);
hasBeenPlayed.setCellFactory(col->newtableCell()){
私有最终ImageView图像=新ImageView();
{
设置图形(图像);
setFitWidth(playedImage.getWidth());
image.setFitHeight(playedImage.getHeight());
}
@凌驾
受保护的void updateItem(布尔项,布尔空){
super.updateItem(项,空);
//根据播放状态设置图像
image.setImage(item!=null&&item?playedImage:null);
}
});

你能显示更多的stacktrace行吗?我怀疑错误在别处…
TableColumn
似乎是错的。这意味着您的单元格值工厂正在返回一个
observeValue
?您需要显示如何设置列以及cell value属性是什么,以及模型类。此外,比较器不定义排序。每当
compare(y,x)<0时,您都需要
compare(x,y)>0
,这里显然不是这种情况。(很明显,这并没有导致类强制转换异常,但稍后会导致问题。)@James_D I修改了问题:)。我尝试了相同的模式,将列更改为
TableColumn
,效果相同。我不知道为什么。。。composator没有报告错误,但它没有顺序。请同时说明您是如何更改比较器的。发布的解决方案有什么问题吗?你能显示更多的stacktrace行吗?我怀疑错误在别处…
TableColumn
似乎是错的。这意味着您的单元格值工厂正在返回一个
observeValue
?您需要显示如何设置列以及cell value属性是什么,以及模型类。此外,比较器不定义排序。每当
compare(y,x)<0时,您都需要
compare(x,y)>0
,这里显然不是这种情况。(很明显,这并没有导致类强制转换异常,但稍后会导致问题。)@James_D I修改了问题:)。我尝试了相同的模式,将列更改为
TableColumn
,效果相同。我不知道为什么。。。composator没有报告错误,但它没有顺序。请同时说明您是如何更改比较器的。发布的解决方案有什么问题?我认为默认的比较器就足够了,一旦更改为使用
Boolean
作为列数据类型。非常聪明的回答Fabian!这也解决了我的另一个问题。一行表示用户使用带有不同
图像的
ImageView
对歌曲(恨、不喜欢、喜欢、爱)的情感。我不知道如何执行这个命令,所以爱首先出现等等,因为我看到我将使用和你的方式:)我明白了