JavaFx ObservableList хочет изменить цвет каждой ячейки

Вот что я делаю.

ListView listView = new ListView();
listView.setBackground(new Background(new 
BackgroundFill(Color.BLACK,CornerRadii.EMPTY, Insets.EMPTY)));
listView.setPrefSize(400,450);
ObservableList list = FXCollections.observableArrayList();
list.add(label);
list.add(label2);
listView.setItems(list);

Так что я могу изменить цвет фона listView, но проблема в том, когда я делаю этот listView.setItems(list); это не показывает мне цвет фона. Это фактически скрывает это. Таким образом, вместо изменения фона listView, я думаю, мне следует изменить цвет наблюдаемых ячеек списка, но я понятия не имею, как это сделать. Любая помощь будет оценена. Заранее спасибо.

1 ответ

Решение

Как сказал Клеопатра, вы не можете добавлять компоненты как элементы. Предметы должны быть объектами только с данными.

Если вы пытаетесь добавить метки, я предполагаю, что вы хотите показать строку в каждой ячейке, поэтому вы должны сделать что-то вроде:

ListView<String> listView = new ListView<>();
listView.setPrefSize(400,450);
listView.getItems().addAll("Foo", "Bar", "Baz");

Для настройки внешнего вида лучше просто использовать css.

.list-cell { -fx-text-fill: black; }
.list-cell:odd { -fx-background-color: white;}
.list-cell:even { -fx-background-color: #8f8; }

И... Если вы хотите настроить способ отображения и поведения каждой ячейки, установите фабрику ячеек следующим образом:

listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> param) {
            ListCell<String> cell = new ListCell() {
                @Override
                protected void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);

                    setGraphic(null);

                    if (empty || item == null) {
                        setText(null);
                    }
                    else {
                        setText((String) item);
                    }
                }
            };

            return cell;
        }
    });

Обычно при создании фабрики ячеек обычно переопределяют updateItem (чтобы настроить ячейку для отображения содержимого элемента) и commitEdit (чтобы сохранить в элементе результат редактирования ячейки).

Другие вопросы по тегам