您如何迭代JFXTreeTableView中的行?

时间:2018-10-15 06:23:39

标签: java javafx tableview pseudo-class jfoenix

我正在制作一个JavaFX项目,并将Jfoenix自定义库用于更好的组件。在我拥有的时间表中,如果事件的开始日期已经过去,我需要将行变成红色,但是我无法在网上找到关于如何遍历行的任何答案。

在我的CSS文件中,如果这些行与给定的标准与伪类toggleRed相匹配,则需要此行将其设置为红色。

.jfx-tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:toggleRed {
    -fx-background-color: red;
}

因此,在我的控制器的initialize方法中,如果行对象有效,我将获得这一行

row.pseudoClassStateChanged(PseudoClass.getPseudoClass("toggleRed"), true);

我需要某种for循环来获取表中的每个表行以在此行上调用,但尚未找到任何有效的方法。请帮忙。我完全迷路了,浪费了太多时间。谢谢!!!

1 个答案:

答案 0 :(得分:1)

您需要根据项目的data属性和当前时间更改rowFactory并更新伪类状态。

以下示例应为您提供有关如何实现此目的的想法:

final PseudoClass toggleRed = PseudoClass.getPseudoClass("toggleRed");

ObjectProperty<LocalDate> currentDate = ...;

treeTableView.setRowFactory(ttv -> new JFXTreeTableRow<Job>() {

    private final InvalidationListener listener = o -> {
        Job item = getItem();
        pseudoClassStateChanged(toggleRed, item != null && item.getStartDate().isAfter(currentDate.get()));
    };
    private final WeakInvalidationListener l = new WeakInvalidationListener(listener);

    {
        // listen to changes of the currentDate property
        currentDate.addListener(l);
    }

    @Override
    protected void updateItem(Job item, boolean empty) {
        // stop listening to property of old object
        Job oldItem = getItem();
        if (oldItem != null) {
            oldItem.startDateProperty().removeListener(l);
        }

        super.updateItem(item, empty);

        // listen to property of new object
        if (item != null) {
            item.startDateProperty().addListener(l);
        }

        // update pseudoclass
        listener.invalidated(null);
    }
});

如果开始日期和/或当前日期是不变的,则可以减少使用的侦听器数量。