Я использую JavaFX для простого проекта в моем университете. Мне нужно создать представление с 2 столбцами, где слева мы можем выбрать курс, а справа мы видим студентов, на которых в настоящее время подписаны.
Для этого все работает хорошо, тогда я должен сделать фон ячеек ListView по-разному окрашивался для выделенных ячеек.
Чтобы выполнить sh, я расширил класс 'ListCell ', создав следующее:
public class StyledSelectableCell<T> extends ListCell<T> {
private Background selBG;
private Background idleBG;
private Paint idleTextCol;
private Paint selTextCol;
public StyledSelectableCell(Colors idleBG) {
assert idleBG.getComplementary() != null;
this.selBG = new Background(new BackgroundFill(idleBG.getComplementary().getVal(), CornerRadii.EMPTY, Insets.EMPTY));
this.idleBG = new Background(new BackgroundFill(idleBG.getVal(), CornerRadii.EMPTY, Insets.EMPTY));
this.idleTextCol = idleBG.getSuggestedTextColor();
this.selTextCol = idleBG.getComplementary().getSuggestedTextColor();
}
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if(item == null) return;
if(this.isSelected()) {
setBG(this.selBG);
setTextFill(this.selTextCol);
}
else {
setBG(this.idleBG);
setTextFill(this.idleTextCol);
}
setText(item.toString());
}
private void setBG(Background c){
this.setBackground(c);
}
}
И затем в основной класс приложения я включил этот код:
// Creating 2 observable lists
ObservableList<Student> studentList = FXCollections.observableArrayList();
ObservableList<Course> courseList = FXCollections.observableArrayList(courses);
// Creating listview for stuxents and courses
ListView<Course> courseLv = new ListView<>(courseList);
ListView<Student> studentLv = new ListView<>(studentList);
// Setting custom colored cells
// TODO bug only present with this two methods uncommented
courseLv.setCellFactory(
courseListView -> new StyledSelectableCell<>(STUD_COL)
);
studentLv.setCellFactory(
studentListView -> new StyledSelectableCell<>(COUR_COL)
);
VBox studentSelection = new VBox();
studentSelection.getChildren().add(studentLv);
VBox courseSelection = new VBox();
courseSelection.getChildren().add(courseLv);
GridPane pane = new GridPane();
pane.addColumn(1, studentSelection);
pane.addColumn(0, courseSelection);
courseLv.getSelectionModel().selectedItemProperty().addListener((observableValue, course, t1) -> {
studentList.clear();
studentList.addAll(t1.getStudents());
});
Когда я запускаю программу, все идет хорошо, я нажимаю на первый курс, и студенты отображаются правильно. Проблема заключается в втором щелчке, когда я выбираю другой курс, в конце отображаются студенты, повторенные дважды, в обратном порядке (очень странно).
Эта картина показывает ситуацию при первом щелчке: https://imgur.com/WPIEfnp
Это когда я выбираю другой курс и появляется ошибка: https://imgur.com/a/VWRp8sQ