Thomas Dejagere
Thomas Dejagere

Reputation: 35

Dynamically change the background of a cell in a ListView

I have a problem with my listview. I have some code that changes the background of some cells in a ListView. But when i scroll in that listview the background changes to the wrong cells.

Here you see some code: Change the background of the cell in a listview:

@Override
        public ListCell<String> call(ListView<String> param) {
            ListCell<String> cell = new ListCell<String>() {
                @Override
                protected void updateItem(String t, boolean bln) {
                    super.updateItem(t, bln);
                    if (t != null) {
                        setText(t);

                        if (!controller.checkGerecht(t)) {

                           if (!getStyleClass().contains("mystyleclass")) {
                                getStyleClass().add("mystyleclass");
                                foutieveInput.add(t);
                            } else {      
                               getStyleClass().remove("mystyleclass");
                            }
                        } else {
                            setText(t);

                        }
                    }
                }

The css file:

.mystyleclass{
    -fx-background-color: #ff0000;
}

Upvotes: 0

Views: 256

Answers (1)

James_D
James_D

Reputation: 209418

You have the logic implemented incorrectly, assuming you want the red background only on cells for which controller.checkGerecht(t) is false. You're trying to remove the style class if it's not present: you want to remove the style class if your condition doesn't hold. (I.e. you have remove in the wrong else clause.)

Additionally, you need to handle the case where the cell is updated to hold a null value (e.g. if it is empty):

public ListCell<String> call(ListView<String> param) {
    ListCell<String> cell = new ListCell<String>() {
        @Override
        protected void updateItem(String t, boolean bln) {
            super.updateItem(t, bln);
            if (t == null) {
                setText(null);
                getStyleClass().remove("mystyleclass");
            } else {
                setText(t);

                if (!controller.checkGerecht(t)) {

                    if (!getStyleClass().contains("mystyleclass")) {
                        getStyleClass().add("mystyleclass");
                        foutieveInput.add(t);
                    } 
                } else {
                    getStyleClass().remove("mystyleclass");
                }
            }

        }
    };
    return cell ;
}

Upvotes: 1

Related Questions