gpt4 book ai didi

java - 为呈现为 SimpleObjectProperty 的 JavaFX TableView 列定义自定义比较器

转载 作者:行者123 更新时间:2023-12-02 02:39:04 24 4
gpt4 key购买 nike

我有一个包含不同列的表,我想添加自定义比较器的签名是这样的:

@FXML
private TableColumn<Media,SimpleObjectProperty<ImageView>> hasBeenPlayed;

因此该列呈现为 ImageView 。它有两种可能的状态,要么 Imageview 将具有 null 图像,或者 ImageView 将具有一个图像,这是我定义的特定图像。

<小时/>

所以我想要的是基于 I如果 ImageView 有 null Image 并且 ImageView 有 Image 进行排序,所以我做了下面的 Comparator但它报告了一个错误,我不知道为什么......

hasBeenPlayed.setComparator( new Comparator<SimpleObjectProperty<ImageView>>() {
@Override
public int compare(SimpleObjectProperty<ImageView> o1 , SimpleObjectProperty<ImageView> o2) {
if (o1.get().getImage() == o2.get().getImage())
return 0;
return -1;
}
});

我应该对上面的内容使用 lambda 表达式,我以这种方式添加它是为了更明显地表达我想要实现的目标。

<小时/>

我收到的错误是..

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

按照 James_D 在评论中的要求:

单元值工厂:

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

模型的一部分媒体:

public abstract class Media {

.....

/** The has been played. */
private SimpleObjectProperty<ImageView> hasBeenPlayed;

.....

/**
* Checks for been played property.
*
* @return the simple object property
*/
public SimpleObjectProperty<ImageView> hasBeenPlayedProperty() {
return hasBeenPlayed;
}

}

最佳答案

您的代码存在多个问题。

首先,您将 UI 元素放入项目类中,这是您应该避免的事情。列的名称暗示显示的属性只有 2 个状态。 boolean 属性会更合适。

使用自定义cellFactory显示图像。

此外,根据错误消息,该列的实际类型应该是 TableColumn<Media, ImageView> .

此外,您还违反了 Comparator 的契约(Contract)通过使其不对称。

您必须确保满足以下条件:

如果comparator.compare(a, b) < 0然后comparator.compare(b, a) > 0 。在你的情况下,除非所有 ImageView ,否则这不会被满足。包含相同的图像(或全部包含 null )。

除了使该属性成为 boolean 属性之外,还可以像这样修改代码:

@FXML
private TableColumn<Media, Boolean> hasBeenPlayed;
<小时/>
hasBeenPlayed.setComparator((v1, v2) -> Boolean.compare(v1, v2));

或者

hasBeenPlayed.setComparator((v1, v2) -> -Boolean.compare(v1, v2));

并将以下内容添加到 initialize Controller 的方法

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);
}
});

关于java - 为呈现为 SimpleObjectProperty<ImageView> 的 JavaFX TableView 列定义自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45783201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com