How can I create ListView
with delete button on every row and delete button action in JavaFX?
Asked
Active
Viewed 7,092 times
5

DVarga
- 21,311
- 6
- 55
- 60

A K Mishra
- 63
- 1
- 8
-
How can i set action to delete a row? – A K Mishra Mar 01 '17 at 10:57
-
Anyone here who can help me? – A K Mishra Mar 01 '17 at 11:05
-
Create custom `ListCell` and `setCellFactory()` of your `ListView`. – MBec Mar 01 '17 at 11:08
1 Answers
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
.
-
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