JavaFX.ListView со стилизованными ячейками отображает дубликаты списков (Java) - PullRequest
0 голосов
/ 11 марта 2020

Я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...