Условие в initialize() (JavaFX)
В initialize() переопределен метод updateItem в TableView:
@FXML private void initialize(){
answersTable.setRowFactory((param) -> new ColorRow());
questionColumn.setCellFactory((param) -> new WrapTextTableCell());
answerColumn.setCellFactory((param) -> new WrapTextTableCell());
questionColumn.setCellValueFactory(cellData ->
cellData.getValue().questionToThisAnswerProperty());
answerColumn.setCellValueFactory(cellData ->
cellData.getValue().answerProperty());
}
private class ColorRow extends TableRow<Answer> {
@Override
protected void updateItem(Answer answer, boolean b) {
super.updateItem(answer, b);
if(!isEmpty()&&verifyModeOn) {
if (!answer.isRigthAnswer()) {
this.setStyle("-fx-background-color:lightcoral");
}
}
}
}
private class WrapTextTableCell<S> extends TableCell<S, String> {
private Text text;
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (text != null) {
text.textProperty().unbind();
}
if (empty || item == null) {
setGraphic(null);
} else {
if (text == null) {
text = new Text();
if (lineBreakOn) {
text.wrappingWidthProperty().bind(getTableColumn().widthProperty());
}
}
text.textProperty().bind(itemProperty());
setGraphic(text);
}
}
}
ColorRow делает красным строки с неправильными ответами (если переменная verifyModeOn==true), а WrapTextTableCell делает перенос строк в таблице, если переменная lineBreakOn==true.
Если убрать условие, тогда все отрабатывает верно. Если условие оставить, тогда появляются следующие проблемы:
ColorRowподсвечивает пустые строки зеркально снизу.- В случае переключения
verifyModeOnв момент исполнения программы таблица подсвечивает значения неведомым мне образом. - В случае переключения
lineBreakOnв момент исполнения программы таблица переносит строки также неведомым не образом.
Данные в таблице переписываются заново после смены условия.
Мне кажется, что в случае отключения те ячейки, в которых уже были записаны данные, остаются с теми же параметрами.
Если параметр установить 1 раз в начале исполнения программы, все отрабатывает как надо (помимо п.1).
Если поставить условие в сам метод initialize(), ничего не срабатывает вообще.
В чем моя ошибка?
Ответы (1 шт):
Проблема в том, что в методе update вы не закладываетесь на второй параметр boolean b, ну т.е. не совсем корректно переопределяете этот метод. в javadoc для TableCell указан пример, как надо переопределять этот метод (обратите внимание на пункт 2)
Note in this code sample two important points:
1.We call the super.updateItem(T, boolean) method. If this is not done, the item and empty properties are not correctly set, and you are likely to end up with graphical issues.
- We test for the empty condition, and if true, we set the text and graphic properties to null. If we do not do this, it is almost guaranteed that end users will see graphical artifacts in cells unexpectedly.
Перепишите ColorRow примерно таким образом
private class ColorRow extends TableRow<Answer> {
@Override
protected void updateItem(Answer answer, boolean b) {
super.updateItem(answer, b);
if (b || answer == null) { //если строчка пустая, то сбрасывает стиль
this.setStyle("");
return;
}
if(!isEmpty() && verifyModeOn) {
if (!answer.isRigthAnswer()) {
this.setStyle("-fx-background-color:lightcoral");
}
}
}
}