[英]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.