JavaFX中的setRowFactory问题

时间:2014-04-22 12:02:30

标签: java javafx

我的app使用JavaFX有问题...在一个视图中我有一个包含人员列表的tableview,我想要一个人更改行样式。这是我的代码:

personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
        @Override
        public TableRow<Person> call(TableView<Person> personTableView) {
            return new TableRowRightFormat();
        }
    });

...

private class TableRowRightFormat extends TableRow {
    @Override
    protected void updateItem(Object o, boolean b) {
        super.updateItem(o, b);

        if(o == null) {
            return;
        }

        getStyleClass().remove("headPerson");

        if(((Person)o).getId()==2) {
            getStyleClass().add("headPerson");
        }
    }
}

它适用于一个人(id = 2)但是当我向上滚动我的桌子并且当id = 2的人消失了另一个id为id的人时!= 2获得称为'headPerson'的样式(总是一个人在可见元素上在tableview中有样式'headPerson',但上面的代码执行一次)。有什么问题?

1 个答案:

答案 0 :(得分:1)

更新:我在JavaFX 2.2和JDK 8上测试了你的代码,它似乎适用于我的简单测试用例。逻辑看似正确;在这些类型的基于样式类的单元格和行实现中,您必须非常小心的一件事是确保不要将给定字符串的多个副本添加到样式类列表中 - 在您的实现中,这看起来很像对。仔细检查并确保add(...)remove(...)方法中的字符串完全相同。

我喜欢以极低的性能成本完全防弹:

private final String headPersonStyleClass = "headPerson" ;

private class TableRowRightFormat extends TableRow<Person> {

    @Override
    protected void updateItem(Person p, boolean b) {
        super.updateItem(p, b);

        ObservableList<String> styleClass = getStyleClass();
        if (p != null && p.getId()==2 && (! styleClass.contains(headPersonStyleClass))) {
            styleClass.add(headPersonStyleClass);
        } else {
            // remove all occurrences:
            styleClass.removeAll(Collections.singleton(headPersonStyleClass));
        }

    }
}

如果您使用的是JavaFX 8,更好的方法是使用PseudoClass