5

How can I create ListView with delete button on every row and delete button action in JavaFX?

enter image description here

DVarga
  • 21,311
  • 6
  • 55
  • 60
A K Mishra
  • 63
  • 1
  • 8

1 Answers1

6

Here is an SSCE that was mainly based on this anwer.

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SO extends Application {
    static class XCell extends ListCell<String> {
        HBox hbox = new HBox();
        Label label = new Label("");
        Pane pane = new Pane();
        Button button = new Button("Del");

        public XCell() {
            super();

            hbox.getChildren().addAll(label, pane, button);
            HBox.setHgrow(pane, Priority.ALWAYS);
            button.setOnAction(event -> getListView().getItems().remove(getItem()));
        }

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            setText(null);
            setGraphic(null);

            if (item != null && !empty) {
                label.setText(item);
                setGraphic(hbox);
            }
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        StackPane pane = new StackPane();
        Scene scene = new Scene(pane, 300, 150);
        primaryStage.setScene(scene);
        ObservableList<String> list = FXCollections.observableArrayList(
                "Item 1", "Item 2", "Item 3", "Item 4");
        ListView<String> lv = new ListView<>(list);
        lv.setCellFactory(param -> new XCell());
        pane.getChildren().add(lv);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

The most important modification is this line

button.setOnAction(event -> getListView().getItems().remove(getItem()));

where the item that this cell represents is removed from the items list of the ListView.

Community
  • 1
  • 1
DVarga
  • 21,311
  • 6
  • 55
  • 60
  • Is there really a need for the `lastItem` field? Your button's action handler can just do `getListView().getItems().remove(getItem())` (and in fact `lastItem` is always the same as `getItem()`). – James_D Mar 01 '17 at 12:53
  • You are totally correct (too dumb copy pasting from my side). Thanks for pointing out. – DVarga Mar 01 '17 at 12:57