uitableview - 如果滚动到底部太快,JavaFX TableView 会崩溃,自定义单元格也会变得不合逻辑
问题描述
因此,首先我尝试将单元格着色为红色,或者根据同一行的另一列的值将单元格标为红色。例如,有一个“Enrolled”日期列和一个“DeadlineToEnrollBy”日期列。这是一个通用的例子。
因此,如果截止日期是明天,则单元格不会显示为红色,因为学生还有时间,但如果截止日期是昨天并且学生仍未注册,则“已注册”日期单元格将显示为红色,表示立即注意那个学生。我实际上能够做到这一点,但桌子有时表现得“时髦”。
如果我快速滚动到底部,我会收到错误消息。有时上下滚动时,红色单元格会在其他地方,或者列中的所有单元格都会变成红色,即使它不应该是红色的。我相信即使上传新数据,因此刷新表格也会导致红细胞关闭。
我得到的错误是
Exception in thread "JavaFX Application Thread"
java.lang.IndexOutOfBoundsException
在这行代码上
Person student= ClassPanelView.retrieveTable().getItems.get(getIndex());
这是相关的代码流
在 ClassPanelView 中
createTable(){
.
.
TableColumn<Person, Date> enrolledBy = new TableColumn<>("Enrolled");
enrolledBy.setCellValueFactory(new PropertyValueFactory<>("dateEnrolled"));
enrolledBy.setCellFactory(column -> {
return new util.EditEnrolledDateCell<Person, Date>();
});
table.getColumns().addAll(enrolledBy, ..etc);
}
public static TableView<Person> retrieveTable() {
return table;
}
列调用/返回的另一个类/单元格
public class EditEnrolledDateCell<S,T> extends TextFieldTableCell<Person, Date> {
private Date now = new Date();
...
...
@Override
public void updateItem(Date item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
if(this.getIndex() > -1) {
/*int currentIndex = indexProperty().getValue() < 0 ? 0
: indexProperty().getValue(); */
Person student = ClassPanelView.retrieveTable().getItems().get(getIndex()); //<==== This line is the problem
if(student.getDeadline != null && student.getDeadline.before(now)) {
setStyle("-fx-border-color: #f40404;\n"
+ "-fx-border-width: 1 1 1 1;\n");
}
}
}
else { //if there is something here, format it
setStyle("");
setText(GuiUtils.monthFirstDateFormat.format(item));
}
}
}
任何提示/知识将不胜感激!谢谢
解决方案
您永远不会为未超过截止日期的人重置单元格的样式。您需要进行此类更新。此外,表格末尾可能存在具有非负索引的空单元格。(仅当单元格为空时,您才尝试检索此人。)
另外为了使单元格更可重用,我建议使用TableCell.getTableView
而不是访问static
字段。
@Override
public void updateItem(Date item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setStyle(null);
setText("");
} else {
Person student = getTableView().getItems().get(getIndex());
setStyle(student.getDeadline != null && !now.after(student.getDeadline)
? null
: "-fx-border-color: #f40404; -fx-border-width: 1 1 1 1;");
// I recommend passing the formatter in a constructor to make the cell type easier to reuse
setText(item == null ? "" : GuiUtils.monthFirstDateFormat.format(item));
}
}
注意:您还应该将该字段重命名getDeadline
为deadline
. getDeadline
按照惯例,是属性的 getter 方法的名称,deadline
我想不出以通常用于 getter 的方式命名字段的原因是好的做法。
此外,我目前看不到将类型参数添加到您的自定义单元格类型的理由。这些类型从未使用过。
public class EditEnrolledDateCell extends TextFieldTableCell<Person, Date>
可能存在您想要保留这些的情况。如果要使用TableView<T>
whereT
是子类型的单元格,Person
或者在列中使用子类型的值类型Date
,但这需要不同的声明:
public class EditEnrolledDateCell<S extends Person, T extends Date> extends TextFieldTableCell<S, T> {
...
@Override
public void updateItem(T item, boolean empty) {
...
此外,如果可能的话,我建议使用LocalDate
而不是Date
,因为这种类型更现代/更易于使用。
推荐阅读
- android - 第三方应用程序是否可以从 ram 中删除未使用的进程?
- flutter - 如何在模拟器中测试颤振指纹代码?
- php - 如何将字段从文本更改为选项框?
- javascript - 如何在动态附加的内部元素上附加点击事件?
- docker - 泊坞窗图像未运行
- c# - 为什么我的 JWT 令牌没有传递给控制器的方法?
- revit-api - Revit:为什么我的墙边界框与它的 LocationCurve 不一致?
- ios - CoreStore 在更新数据模型时插入数组作为关系对象
- javascript - 多维数组的排序序列跨浏览器兼容并具有“自然情况”
- angular - WebStorm 不会在 Angular CLI 应用程序中遇到断点