为呈现为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
对歌曲(恨、不喜欢、喜欢、爱)的情感。我不知道如何执行这个命令,所以爱首先出现等等,因为我看到我将使用和你的方式:)我明白了