Цвета ListView в Java - PullRequest
       12

Цвета ListView в Java

0 голосов
/ 01 декабря 2018

Я пытаюсь добавить цвета фона в свой ListView через ListCell.

Мой ListView работает, но у меня возникла проблема с ListCell.Это как-то перезаписывает цвета после каждого элемента ListView.Мой текущий результат заключается в том, что только последний элемент моего ListView получает цвет фона серый (так как его Приоритет "Нейтральный").Мое предложение состоит в том, что каждый ListCell перезаписывает предыдущий, так что цвета, установленные ранее, обновляются до «ноль», потому что приоритет текущего элемента другой.У кого-нибудь есть идея, пожалуйста?

Редактировать: Я попробовал предложение Фабиана.Я могу создавать заметки, но каким-то образом имена заметок по-прежнему являются идентификаторами блокнота (т.е. «Блокнот @« HexCode »»).Кроме того, цвета не работают.Это полный метод, который я реализую:

    public void initialize() throws SQLException {
    //initializing listView
    notesListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
    //initializing listView items depending on instance + depending on User
    if (this.objectType instanceof Student) {
        ObservableList<Notepad> list = FXCollections.observableArrayList();
        for(StudentNotepad s : db.getStudentNotepadDao()) {
            if(db.getLoggedInUser() == s.getNotepad().getUser()) {
                list.add(s.getNotepad());
            }
        }
        notesListView.setItems(list);
            notesListView.getItems().clear(); // this is not necessary, if the list is guaranteed to be empty
            db.getStudentNotepadDao().queryForAll().stream()
                    .map(StudentNotepad::getNotepad)
                    .filter(n -> n.getUser().equals(db.getLoggedInUser()))
                    .forEach(notesListView.getItems()::add);
            notesListView.setCellFactory(new Callback<ListView<Notepad>, ListCell<Notepad>>() {
                public ListCell<Notepad> call(ListView<Notepad> param) {
                    return new ListCell<Notepad>() {
                        @Override
                        protected void updateItem(Notepad item, boolean empty) {
                            super.updateItem(item, empty);

                            String style = "";
                            if (!empty && item != null) {
                                setText(item.getNotepadName());

                                // this switch could be rewritten using a Map<String, String>
                                switch (item.getNotepadPriority()) {
                                    case "Hoch":
                                        style = "-fx-background-color: red";
                                        break;
                                    case "Mittel":
                                        style = "-fx-background-color: yellow";
                                        break;
                                    case "Niedrig":
                                        style = "-fx-background-color: green";
                                        break;
                                    case "Neutral":
                                        style = "-fx-background-color: grey";
                                        break;
                                }
                            } else {
                                setText("");
                            }
                            setStyle(style);
                        }

                    };
                }
            });
        }

}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Все ListCell созданы одной и той же фабрикой.Замена фабрики несколько раз приводит к тому, что последняя фабрика создает ячейки, а не ячейки, создаваемые фабрикой, установленной во время итерации, соответствующей элементу.

n.getNotepad().getNotepadName().equals(item)

дает только true для одного элемента по этой причине..

Используйте здесь ListView<Notepad> (я предполагаю, StudentNotepad.getNotepad возвращает объект типа Nodepad).

В следующем коде также предполагается, что db.getStudentNotepadDao().queryForAll() возвращает Collection,Если он возвращает массив, используйте Stream.of с массивом в качестве параметра вместо метода stream().

notesListView.getItems().clear(); // this is not necessary, if the list is guaranteed to be empty
db.getStudentNotepadDao().queryForAll().stream()
                                       .map(StudentNotepad::getNotepad)
                                       .filter(n -> n.getUser().equals(db.getLoggedInUser()))
                                       .forEach(notesListView.getItems()::add);

notesListView.setCellFactory(new Callback<ListView<Notepad>, ListCell<Notepad>>() {
    public ListCell<Notepad> call(ListView<Notepad> param) {
        return new ListCell<Notepad>() {
            @Override
            protected void updateItem(Notepad item, boolean empty) {
                super.updateItem(item, empty);

                String style = "";
                if (!empty && item != null) {
                     setText(item.getNotepadName());

                     // this switch could be rewritten using a Map<String, String>
                     switch (item.getNotepadPriority()) {
                         case "Hoch":
                             style = "-fx-background-color: red";
                             break;
                         case "Mittel":
                             style = "-fx-background-color: yellow";
                             break;
                         case "Niedrig":
                             style = "-fx-background-color: green";
                             break;
                         case "Neutral":
                             style = "-fx-background-color: grey";
                             break;
                     }
                } else {
                    setText("");
                }
                setStyle(style);
            }

        };
    }
});
0 голосов
/ 01 декабря 2018

Есть довольно много проблем с вашим кодом.

  1. Вы можете объявить studentNotes как ObservableList и использовать его напрямую без лишних временных list (Если только выя действительно хочу использовать его как ArrayList по какой-то причине, что я не думаю, что вы это делаете).

  2. Вы должны вызывать notesListView.setItems и notesListView.setCellFactory после цикла, а невнутри него.Затем внутри вашего метода updateItem вам нужно выполнить поиск, чтобы получить объект StudentNotepad, который соответствует передаваемому ему item.

  3. Было бы намного проще, если бы вы объявили notesListView как ListView<Notepad> (я полагаю, это класс, который вы используете для своих объектов блокнота), так что updateItem дает вам объект Notepad напрямую, затем вы можете использовать вызов setText и передать свойство, которое вы хотите показать.Если вы не знаете, как это сделать, вы можете посмотреть на Этот SO поток

...