根据 tableview javafx 内的条件设置图标

Jiv*_*ari 0 javafx tableview imageview

我正在构建一个应用程序,它将根据特定条件显示图像。目前,我的数据显示在 JavaFX 上的表格视图中。我的可观察模型类仅包含有关用户输入信息的信息。我需要比较表视图类中的信息并在称为状态的指定列之一内显示图像。

TableColumn<StudentRecord, ImageView> statusCol = new TableColumn<>("Status"); 
Run Code Online (Sandbox Code Playgroud)

我遵循了不同的答案,但找不到合适的解决方案。我这样做是为了循环遍历所有对象并显示图标。但这种方法会在每一行上显示图标。

dataController.getAllData().forEach(studentRecord -> {
                    if (studentRecord.getDate().equalsIgnoreCase("some date")) {

                        statusCol.setCellValueFactory(c -> new SimpleObjectProperty<ImageView>(new ImageView("/images/tick.png")));
                    }else{
                        statusCol.setVisible(false);
                    }
                }
        );
Run Code Online (Sandbox Code Playgroud)

我尝试了 StackOverflow 的不同答案,但无法正确实现它。知道如何解决这个问题吗?

fab*_*ian 5

您需要使用基于项目的数据,而不是简单地忽略数据并始终返回ImageView具有相同图像的 a :

final Image image = new Image("/images/tick.png");
statusCol.setCellValueFactory(c -> {
    StudentRecord studentRecord = c.getValue();
    return studentRecord.getDate().equalsIgnoreCase("some date") ? new SimpleObjectProperty<>(new ImageView(image)) : null;
});
Run Code Online (Sandbox Code Playgroud)

或者更好的是避免重新ImageView使用自定义单元格:

public class ImageTableCell<T> extends TableCell<T, Boolean> () {
    private final ImageView imageView;
    private final Image trueImage;
    private final Image falseImage;

    public ImageTableCell(Image trueImage, Image falseImage) {
        imageView = new ImageView();
        setGraphic(imageView);
        this.trueImage = trueImage;
        this.falseImage = falseImage;
    }

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

        if (empty || item == null) {
            imageView.setImage(null);
        } else {
            imageView.setImage(item ? trueImage : falseImage);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
final Image falseImage = null;
final Image trueImage = new Image("/images/tick.png");
statusCol.setCellValueFactory(c -> new SimpleBooleanProperty(c.getValue().getDate().equalsIgnoreCase("some date")));
statusCol.setCellFactory(c -> new ImageTableCell<>(trueImage, falseImage));
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我不建议将日期存储为字符串。更好地使用LocalDate