При прокрутке существующие строки повторно используются для отображения новых элементов. Так, например, если у вас была строка, в которой отображался элемент, находившийся в состоянии «ошибка», и он повторно использовался для элемента, находящегося в состоянии «ОК», тогда оба псевдокласса будут установлены на 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)));
}
});