我正在为一个人制作出勤 TableView 。我正在获取 tableView 行,如果该特定日期的人状态为“存在”(字符串),那么我想更改该特定行并将其背景颜色更改为绿色。
然后,如果他在那特定天“缺席”,我想更改该行并设置红色背景。
否则,如果行中没有日期和状态,我需要再次更改行并设置白色背景。
问题:它正在执行第一个 if 语句,然后将每一行设置为绿色,因为第一个语句为“true”。
我只想获取包含当前内容的行,并将该行设置为绿色背景颜色。
*getStatus 返回字符串
studentTable.setRowFactory(tableView -> {
final TableRow<Attendance> row = new TableRow<>();
for (Attendance item : studentTable.getItems()) {
if (item.getStatus().equals("present")) {
row.setStyle("-fx-background-color:green;");
}
else if (item.getStatus().equals("absent")){
row.setStyle("-fx-background-color:red;");
}
else {
row.setStyle("-fx-background-color:white;");
}
}
return row;
});
}
结果图片:Image
我将感谢任何解决方案和任何帮助:)
最佳答案
您的代码所做的就是在需要时创建一个 TableRow
,然后每次创建 TableRow
时,它都会迭代所有项目在表格中,不断更改单行的样式。因此,该行的样式将由表的项目列表中的最后一项确定(因为该项目决定对 setStyle(...)
的最终调用)。当然,您对创建的每一行都执行此操作,因此毫不奇怪,每一行都具有相同的样式。
首次使用该行显示 Attendance
实例时,会调用 TableRow
的 updateItem(...)
方法,并且每当重复使用该行来显示不同的Attendance
实例时,都会再次出现。因此,您需要重写 updateItem()
并将逻辑放在那里。
studentTable.setRowFactory(tableView -> new TableRow<Attendance>() {
@Override
protected void updateItem(Attendance attendance, boolean empty) {
super.updateItem(attendance, empty);
if (empty) {
setStyle("");
} else if (attendance.getStatus().equals("present")) {
setStyle("-fx-background-color:green;");
} else if (attendance.getStatus().equals("absent")) {
setStyle("-fx-background-color:red;");
} else {
setStyle("-fx-background-color:white;");
}
}
});
关于java - 获取具有某些条件的 tableView 项目的特定行(JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49438854/