JavaFX 表视图滚动颜色不同的行,这些行不需要着色



论坛,

我已经创建了一个表视图。每一行都填充了每个"Steckerpin"对象所提供的信息。使用RowFactory,我根据每个对象("Steckerpin"(的属性"Zustand"的值为每一行的背景着色。

问题是,当表格变得可滚动时,新出现的行的颜色与开头的颜色行的顺序相似。但是这些行不应该被着色,因为它们的属性"祖斯坦德"没有改变。

滚动前的彩色行

滚动后新出现的行

如果我滚动到表格的末尾,错误颜色的行将再次变为白色。

我读到,将表视图与RowFactory结合使用是一个常见的问题,因为一旦开始滚动,行就会被重用。

这是我使用RowFactory的代码:

durchgangsTable.setRowFactory(tv -> new TableRow<Steckerpin>() {
@Override
public void updateItem(Steckerpin item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
setStyle("");
} else if (item.getZustand().equals(okZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), true);
} else if (item.getZustand().equals(fehlerZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), true);
} else if (item.getZustand().equals(prüfZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), true);
}
}
});

我读过几个类似的问题,但我找不到解决问题的办法。因此,我将非常感谢您的帮助。

滚动时,将重用现有行以显示新项目。因此,例如,如果您有一行显示了一个处于"错误"状态的项,并且它被重用于一个位于"正常"状态的项目,那么这两个伪类都将被设置为true

因此,您需要在所有条件下将所有伪类设置为正确的状态:

durchgangsTable.setRowFactory(tv -> new TableRow<Steckerpin>() {
@Override
public void updateItem(Steckerpin item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
setStyle("");
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), false);
} else if (item.getZustand().equals(okZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), true);
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), false);
} else if (item.getZustand().equals(fehlerZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), true);
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), false);
} else if (item.getZustand().equals(prüfZustString)) {
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), true);
} else {
pseudoClassStateChanged(PseudoClass.getPseudoClass("ok"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("error"), false);
pseudoClassStateChanged(PseudoClass.getPseudoClass("pending"), false);
}
}
});

等价地,代码更少:

durchgangsTable.setRowFactory(tv -> new TableRow<Steckerpin>() {
private final List<String> states = List.of("ok", "error", "pending");
@Override
public void updateItem(Steckerpin item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
setStyle("");
updateState(null);
} else if (item.getZustand().equals(okZustString)) {
updateState("ok");
} else if (item.getZustand().equals(fehlerZustString)) {
updateState("error");
} else if (item.getZustand().equals(prüfZustString)) {
updateState("pending");
} else {
updateState(null);
}
}
private void updateState(String newState) {
states.forEach(state ->
pseudoClassStateChanged(PseudoClass.getPseudoClass(state), state.equals(newState)));
}
});

相关内容

最新更新