[英]Change TableRow color based on content
我想制作一个根据行的内容更改行颜色的表。 因此,我使用以下代码。 我自己完成了此操作,这似乎是问题的原因;)因为设置row
背景的那一部分似乎无法按预期工作:
带有GOODFRIENDS
的row
不会更改其颜色,而是上面的行。 如您所见,我放置了System.out.println(row.getItem());
在设置颜色之前,请确保该row
是正确的“行”。 -是的。 所以到那时我还不知道为什么总是在错误的row
上涂上颜色,而在运行时row
引用是另一行(正确的row
)。
有任何想法吗?
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;
}
更新: James_D解决方案可以很好地为行着色,但是sedOnMouseClicked
事件不起作用,因为它们基于现在为空的行对象。
row.setOnMouseClicked(mouseEvent -> {
if (!row.isEmpty()) {
defriend_Button.setDisable(false);
if (row.getItem().getState() == State.FRIEND) {
goodFriend_Button.setDisable(false);
} else {
goodFriend_Button.setDisable(true);
}
} else if (row.isEmpty()) {
personTable.getSelectionModel().select(null);
defriend_Button.setDisable(true);
goodfriend_Button.setDisable(true);
}
if (mouseEvent.getClickCount() == 2 && (!row.isEmpty())) {
controller.showFriendDescriptionView(row.getItem());
}
});
您似乎假设将为表中的每个项目创建一个表格行,并以项目存在的顺序进行创建。 没有这样的保证,实际上在大多数情况下这是不会发生的。 TableRow
本质上是为每个可见行创建的(无论它们是否包含一个项目),当用户滚动或显示的项目由于其他原因而改变时, 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 ;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.