我的应用程序使用 JavaFX 时遇到问题...在一个 View 中,我有一个包含人员列表的表格 View ,我想更改一个人的行样式。这是我的代码:
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!=2 的人会获得名为“headPerson”的样式(可见元素上始终有一个人)在 tableview 中具有样式“headPerson”,但上面的代码只执行一次)。有什么问题吗?
最佳答案
更新:我在 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
来实现此目的。
关于java - JavaFX 中的 setRowFactory 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218946/