JafaFX ListView изменить цвет отдельных ячеек / предметов / рядов - PullRequest
0 голосов
/ 02 октября 2018

Вероятно, ответ на этот вопрос очень прост, поэтому я постараюсь сохранить свой пост таким образом.

Моя проблема Я хочу Text-Color различных Cells/Rows/Items быть настраиваемым через JavaFX ColorPicker.Мой код работает, но не совсем так, как я хочу. Каждый раз, когда к ListView добавляется новый Item, целый ListView меняет свой Text-Color Text-Color, выбранный для последнего Item.

Вот мой код (полный класс приведен ниже, но я не думаю, что это необходимо)

@FXML
void handleAdd(){   //When add button is clicked

    fontSize = 16.0;

    listView.setCellFactory(cell -> {
        ListCell<String> cel = new ListCell<String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (item != null) {
                    setTextFill(colorPicker.getValue());
                    setFont(Font.font(16));
                    setText(item);
                } else {
                    setText("");
                }
            }
        };
        return cel;
    });


    listView.getItems().add(input.getText()); //input is my TextField

    input.clear();
}

полный класс

Заранее спасибо!

1 Ответ

0 голосов
/ 02 октября 2018

Используйте тип элемента для ListView, который содержит ObjectProperty<Color> в дополнение к строке

private static class ListItem {
    public ListItem(String text) {
        this.text = text;
    }

    private final String text;
    private final ObjectProperty<Color> color = new SimpleObjectProperty(Color.BLACK);
}
ListView<ListItem> listView;
listView.setCellFactory(cell -> {
    ListCell<ListItem> cel = new ListCell<ListItem>() {
        @Override
        protected void updateItem(ListItem item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                textFillProperty().bind(item.color);
                setFont(Font.font(16));
                setText(item.text);
            } else {
                setText("");
                textFillProperty().unbind();
                setTextFill(Color.BLACK);
            }
        }
    };
    return cel;
});

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

ListItem selectedItem = listView.getSelectionModel().getSelectedItem();
if (item != null) {
    item.color.set(Color.RED);
}
...