我想创建一个基于行内容更改行颜色的表。因此,我使用以下代码。我自己做了这个,这似乎是问题的原因;)因为设置ServletContextListener
背景的部分似乎没有按预期工作:
不是row
row
改变了它的颜色,而是上面的颜色。
如您所见,我在设置颜色之前放置了GOODFRIENDS
,以确保System.out.println(row.getItem());
是正确的“行”。 - 确实如此。所以在那一点上我不知道为什么总是错误的row
被着色而运行时的row
引用是另一个(正确的)。
有什么想法吗?
row
更新:
James_D解决方案适用于着色行,但personTable.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
Person person;
int counter = 0;
@Override
public TableRow<Person> call(TableView<Person> tableView) {
TableRow<Person> row = new TableRow<>();
if (counter < tableView.getItems().size() && (person = tableView.getItems().get(counter)) != null) {
row.setItem(person);
counter++;
}
if (row.getItem() != null && row.getItem().getState() == State.GOODFRIEND) {
System.out.println(row.getItem());
row.setStyle("-fx-background-color: green;");
//OR
row.setBackground(new Background(
new BackgroundFill(Color.LIGHTGREEN, CornerRadii.EMPTY, new Insets(3, 0, 3, 0))));
}
row.setOnMouseClicked....
return row;
}
事件不起作用,因为它们基于现在空的行对象。
sedOnMouseClicked
答案 0 :(得分:1)
您似乎假设将为表中的每个项目创建一个表行,并按照项目存在的顺序创建。没有这样的保证,事实上在大多数情况下,这种情况不会发生。基本上为每个可见行创建TableRow
(无论它们是否包含项目),并在用户滚动时显示不同的项目,或者显示的项目因其他原因而更改。
所以你需要覆盖updateItem(...)
方法并在那里执行逻辑。
personTable.setRowFactory(tv -> {
TableRow<Person> row = new TableRow<Person>() {
@Override
public void updateItem(Person person, boolean empty) {
super.updateItem(person, empty);
if (person != null && person.getState() == State.GOODFRIEND) {
setStyle("-fx-background-color: green;");
} else {
setStyle("");
}
}
};
row.setOnMouseClicked(...);
return row ;
});