Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Delete Rows using row buttons in Javafx TableView
import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import com.sun.prism.impl.Disposer.Record;
/**
* Author : Abhinay_Agarwal
*/
public class TableViewDeleteSample extends Application {
private TableView<Person> tableView = new TableView<Person>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Eliza", "Smith", "eliza.smith@javafxpro.com"),
new Person("Isabella", "Johnson", "isabella.johnson@javafxpro.com"),
new Person("Imran", "Williams", "imran.williams@javafxpro.com"),
new Person("Emma", "Jones", "emma.jones@javafxpro.com"),
new Person("Russel", "Peters", "russel.peters@javafxpro.com"));
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
@SuppressWarnings("unchecked")
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Table With Delete Row");
tableView.setEditable(false);
TableColumn<Person, String> firstName = new TableColumn<Person, String>("First Name");
TableColumn<Person, String> lastName = new TableColumn<Person, String>("Last Name");
TableColumn<Person, String> email = new TableColumn<Person, String>("Email");
firstName.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
lastName.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
email.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));
tableView.getColumns().add(firstName);
tableView.getColumns().add(lastName);
tableView.getColumns().add(email);
//Insert Button
TableColumn col_action = new TableColumn<>("Action");
tableView.getColumns().add(col_action);
col_action.setCellValueFactory(
new Callback<TableColumn.CellDataFeatures<Record, Boolean>,
ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Record, Boolean> p) {
return new SimpleBooleanProperty(p.getValue() != null);
}
});
//Adding the Button to the cell
col_action.setCellFactory(
new Callback<TableColumn<Record, Boolean>, TableCell<Record, Boolean>>() {
@Override
public TableCell<Record, Boolean> call(TableColumn<Record, Boolean> p) {
return new ButtonCell();
}
});
tableView.setItems(data);
VBox vBox = new VBox();
vBox.getChildren().addAll(tableView);
primaryStage.setScene(new Scene(vBox, 440, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
//Define the button cell
private class ButtonCell extends TableCell<Record, Boolean> {
final Button cellButton = new Button("Delete");
ButtonCell(){
//Action when the button is pressed
cellButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
// get Selected Item
Person currentPerson = (Person) ButtonCell.this.getTableView().getItems().get(ButtonCell.this.getIndex());
//remove selected item from the table list
data.remove(currentPerson);
}
});
}
//Display button if the row is not empty
@Override
protected void updateItem(Boolean t, boolean empty) {
super.updateItem(t, empty);
if(!empty){
setGraphic(cellButton);
}
}
}
}
@filippomortari

This comment has been minimized.

Copy link

@filippomortari filippomortari commented Mar 28, 2014

Hey!

I discovered this code, which is quite similar to some other resources found on the web dealing with the same problem. All of those implementation, like yours, still display the "delete" buttons on the respective deleted rows. any tips regarding how to solve that issue?

cheers

@filippomortari

This comment has been minimized.

Copy link

@filippomortari filippomortari commented Apr 8, 2014

apparently, for anyone who's interested, I solved this issue by intercepting empty rows this way:

//Display button if the row is not empty
@override
protected void updateItem(Boolean t, boolean empty) {
super.updateItem(t, empty);
if(!empty){
setGraphic(cellButton);
}
else{
setGraphic(null);
}
}

@pgkaila

This comment has been minimized.

Copy link

@pgkaila pgkaila commented Mar 11, 2015

Thanks 😊 @filippomortari

@Maverick283

This comment has been minimized.

Copy link

@Maverick283 Maverick283 commented Sep 3, 2015

@filippomortari Thanks!!!! Of course it can be that easy^^

@DdMad

This comment has been minimized.

Copy link

@DdMad DdMad commented Oct 13, 2015

@filippomortari Thanks a lot!

@JeffreyCA

This comment has been minimized.

Copy link

@JeffreyCA JeffreyCA commented Dec 25, 2015

Thank you!

In my case I wanted to delete the item in both the ObservableList and the actual ArrayList, so I had to do something like:

data.remove(currentPerson);
arrayList.remove(currentPerson);
@samarth-29

This comment has been minimized.

Copy link

@samarth-29 samarth-29 commented Nov 16, 2017

@JeremyPansier

This comment has been minimized.

Copy link

@JeremyPansier JeremyPansier commented May 18, 2018

Thank you very much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.