title: JavaFX TableView with CSV add data to CSV
body: <p>First of all, I searched on Google in the first 5 pages and I couldn't find any solution to my problem.</p>
  
  <p>So my problem is that I have a CSV file with data. It's connected to my TableView so the data of my CSV file fills the table.</p>
  
  <p>I have an add button (Toevoegen), an edit button (Bewerken) and a delete button (Verwijder). So it is possible to add a column to the table and delete a column, but it doesn't delete or add to the CSV file which I want to have. </p>
  
  <p>Also editing the table in a new scene with TextFields should be in it, but I can't seem to figure that out neither...</p>
  
  <p>Hope someone can help me here is my code:</p>
  
  <p><strong><em>Main.java:</em></strong></p>
  
  <pre><code>import com.sun.prism.impl.Disposer;
  import javafx.application.Application;
  import javafx.collections.FXCollections;
  import javafx.collections.ObservableList;
  import javafx.event.ActionEvent;
  import javafx.event.EventHandler;
  import javafx.geometry.Insets;
  import javafx.geometry.Pos;
  import javafx.scene.Scene;
  import javafx.scene.control.*;
  import javafx.scene.control.cell.PropertyValueFactory;
  import javafx.scene.layout.BorderPane;
  import javafx.scene.layout.HBox;
  import javafx.scene.layout.TilePane;
  import javafx.scene.layout.VBox;
  import javafx.stage.Modality;
  import javafx.stage.Stage;
  import java.io.BufferedReader;
  import java.io.FileNotFoundException;
  import java.io.FileReader;
  import java.io.IOException;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import javafx.scene.control.TableColumn;
  import javafx.scene.control.TableView;
  
  
  public class Main extends Application
  {
  
      Stage window;
      TextField voornaamInput, achternaamInput;
  
      private final TableView&lt;Gebruiker&gt; table = new TableView&lt;&gt;();
  
      private final ObservableList&lt;Gebruiker&gt; dataList
              = FXCollections.observableArrayList();
  
      public static void main(String[] args)
      {
          launch(args);
      }
  
      @Override
      public void start(Stage primaryStage)
      {
          window = primaryStage;
          window.setTitle("JavaFX - Nick van Bruggen");
  
      //&lt;editor-fold desc="Begin Titel"&gt;
      //Begin Titel
          //titelText
          Label titelText = new Label();
          titelText.setText("Welkom bij de JavaFX applicatie van Nick van Bruggen!\n");
  
          Label titelsubText = new Label();
          titelsubText.setText("Hier kunt u gebruikers toevoegen, bewerken en verwijderen.");
  
          //Titel layout
          VBox titelLayout = new VBox();
          titelLayout.getChildren().addAll(titelText, titelsubText);
  
          titelText.setStyle("-fx-font-size: 18px; -fx-text-align: center;");
          titelsubText.setStyle("-fx-font-size: 18px; -fx-text-align: center;");
          titelLayout.setPadding(new Insets(10, 0, 0, 10));
      //Einde Titel
      //&lt;/editor-fold&gt;
  
      //&lt;editor-fold desc="Begin Table"&gt;
      //Begin Table
          //Naam column
          TableColumn&lt;Gebruiker, String&gt; voornaamColumn = new TableColumn&lt;&gt;("Voornaam");
          voornaamColumn.setMinWidth(200);
          voornaamColumn.setCellValueFactory(new PropertyValueFactory&lt;&gt;("Voornaam"));
  
          //Achternaam column
          TableColumn&lt;Gebruiker, String&gt; achternaamColumn = new TableColumn&lt;&gt;("Achternaam");
          achternaamColumn.setMinWidth(200);
          achternaamColumn.setCellValueFactory(new PropertyValueFactory&lt;&gt;("Achternaam"));
  
          //Table layout
          table.setItems(dataList);
          table.getColumns().addAll(voornaamColumn, achternaamColumn);
  //        table = new TableView&lt;&gt;();
  //        table.setItems(getGebruiker());
      //Einde Table
      //&lt;/editor-fold&gt;
  
      //&lt;editor-fold desc="Begin Buttons"&gt;
      //Buttons
  
          //Toevoegen Alert box
          Button toevoegButton = new Button("Toevoegen");
          toevoegButton.setOnAction(new EventHandler&lt;ActionEvent&gt;() {
  
                @Override
                public void handle(ActionEvent event) {
  
                    //titelLayout
                    Label titelLabel = new Label();
                    titelLabel.setText("Hier kunt u gebruikers toevoegen");
  
                    HBox titelLayout = new HBox();
                    titelLayout.setPadding(new Insets(10, 10, 10, 10));
                    titelLayout.getChildren().add(titelLabel);
  
                    //naamInput
                    voornaamInput = new TextField();
                    voornaamInput.setPromptText("Voornaam");
                    voornaamInput.setMinWidth(100);
  
                    //naamInput
                    achternaamInput = new TextField();
                    achternaamInput.setPromptText("Achternaam");
                    achternaamInput.setMinWidth(100);
  
                    VBox inputLayout = new VBox(10);
                    inputLayout.setPadding(new Insets(10, 10, 10, 10));
                    inputLayout.getChildren().addAll(voornaamInput, achternaamInput);
  
                    //buttonLayout
                    Button saveButton = new Button("Save");
                    saveButton.setOnAction(e -&gt; saveButtonAddClicked());
  
                    //VBox Layout
                    HBox buttonLayout = new HBox(10);
                    buttonLayout.setPadding(new Insets(10, 10, 10, 10));
                    buttonLayout.getChildren().add(saveButton);
                    buttonLayout.setAlignment(Pos.CENTER);
  
                    //borderPane
                    //BorderPane layout
                    BorderPane borderPaneToevoegen = new BorderPane();
                    borderPaneToevoegen.setTop(titelLayout);
                    borderPaneToevoegen.setBottom(buttonLayout);
                    borderPaneToevoegen.setCenter(inputLayout);
  
                    Scene secondScene = new Scene(borderPaneToevoegen, 600, 400);
  
                    // New window (Stage)
                    Stage newWindow = new Stage();
                    newWindow.setTitle("JavaFX - Toevoegen");
                    newWindow.setScene(secondScene);
  
                    // Specifies the modality for new window.
                    newWindow.initModality(Modality.WINDOW_MODAL);
  
                    // Specifies the owner Window (parent) for new window
                    newWindow.initOwner(primaryStage);
  
                    // Set position of second window, related to primary window.
                    newWindow.setX(primaryStage.getX() + 200);
                    newWindow.setY(primaryStage.getY() + 100);
  
                    newWindow.show();
  
                }
          });
  
          //Bewerken Alert box
          Button bewerkButton = new Button("Bewerken");
          bewerkButton.setOnAction(new EventHandler&lt;ActionEvent&gt;() {
  
              @Override
              public void handle(ActionEvent event) {
  
                  //titelLayout
                  Label titelLabel = new Label();
                  titelLabel.setText("Hier kunt u gebruikers bewerken");
  
                  HBox titelLayout = new HBox();
                  titelLayout.setPadding(new Insets(10, 10, 10, 10));
                  titelLayout.getChildren().add(titelLabel);
  
                  //inputLayout
                  TextField voornaamInput, achternaamInput;
  
                  //naamInput
                  voornaamInput = new TextField();
                  voornaamInput.setPromptText("Voornaam");
                  voornaamInput.setMinWidth(100);
  
                  //naamInput
                  achternaamInput = new TextField();
                  achternaamInput.setPromptText("Achternaam");
                  achternaamInput.setMinWidth(100);
  
                  VBox inputLayout = new VBox(10);
                  inputLayout.setPadding(new Insets(10, 10, 10, 10));
                  inputLayout.getChildren().addAll(voornaamInput, achternaamInput);
  
                  //buttonLayout
                  Button saveButton = new Button("Save");
                  saveButton.setOnAction(e -&gt; saveButtonEditClicked());
  
  
          //      HBox Layout
                  HBox buttonLayout = new HBox(10);
                  buttonLayout.setPadding(new Insets(10, 10, 10, 10));
                  buttonLayout.getChildren().add(saveButton);
                  buttonLayout.setAlignment(Pos.CENTER);
  
                  //borderPane
                  //BorderPane layout
                  BorderPane borderPaneBewerken = new BorderPane();
                  borderPaneBewerken.setTop(titelLayout);
                  borderPaneBewerken.setBottom(buttonLayout);
                  borderPaneBewerken.setCenter(inputLayout);
  
                  Scene secondScene = new Scene(borderPaneBewerken, 600, 400);
  
                  // New window (Stage)
                  Stage newWindow = new Stage();
                  newWindow.setTitle("JavaFX - Bewerken");
                  newWindow.setScene(secondScene);
  
                  // Specifies the modality for new window.
                  newWindow.initModality(Modality.WINDOW_MODAL);
  
                  // Specifies the owner Window (parent) for new window
                  newWindow.initOwner(primaryStage);
  
                  // Set position of second window, related to primary window.
                  newWindow.setX(primaryStage.getX() + 200);
                  newWindow.setY(primaryStage.getY() + 100);
  
                  newWindow.show();
              }
          });
  
          Button verwijderButton = new Button("Verwijder");
          verwijderButton.setOnAction(e -&gt; verwijderButtonClicked());
          TilePane buttonLayout = new TilePane();
          buttonLayout.setPrefWidth(100);
  
          //Button style
          toevoegButton.setStyle("-fx-border-color: black;");
          bewerkButton.setStyle("-fx-border-color: black;");
          verwijderButton.setStyle("-fx-border-color: black;");
  
          toevoegButton.setMaxWidth(buttonLayout.getPrefWidth());
          bewerkButton.setMaxWidth(buttonLayout.getPrefWidth());
          verwijderButton.setMaxWidth(buttonLayout.getPrefWidth());
  
          buttonLayout.setHgap(5.0);
  
          buttonLayout.setPadding(new Insets(10, 10, 10, 10));
          buttonLayout.getChildren().addAll(toevoegButton, bewerkButton, verwijderButton);
          //Einde buttons
      //&lt;/editor-fold&gt;
  
          //BorderPane layout
          BorderPane borderPane = new BorderPane();
          borderPane.setTop(titelLayout);
          borderPane.setBottom(buttonLayout);
          borderPane.setCenter(table);
  
          //Scene
          Scene scene = new Scene(borderPane, 1260, 600);
          window.setScene(scene);
          window.show();
  
          readCSV();
  
      }
  
  
  //    CSV bestand lezen
      private void readCSV() {
  
          String CsvFile = "src/gebruikers.csv";
          String FieldDelimiter = ",";
  
          BufferedReader br;
  
          try {
              br = new BufferedReader(new FileReader(CsvFile));
  
              String line;
              while ((line = br.readLine()) != null) {
                  String[] fields = line.split(FieldDelimiter, -1);
  
                  Gebruiker gebruiker = new Gebruiker(fields[0], fields[1]);
                  dataList.add(gebruiker);
              }
  
          } catch (FileNotFoundException ex) {
              Logger.getLogger(Main.class.getName())
                      .log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(Main.class.getName())
                      .log(Level.SEVERE, null, ex);
          }
  
      }
  
  
      //Table gebruikers
  //    public ObservableList&lt;Gebruiker&gt; getGebruiker()
  //    {
  //        ObservableList&lt;Gebruiker&gt; gebruikers = FXCollections.observableArrayList();
  //        gebruikers.add(new Gebruiker("Nick", "van Bruggen"));
  //        gebruikers.add(new Gebruiker("Daan", "van Bruggen"));
  //        gebruikers.add(new Gebruiker("Wim", "Pietje"));
  //        return gebruikers;
  //    }
  
  //    Save button bij toevoegen
      public void saveButtonAddClicked()
      {
          Gebruiker gebruiker = new Gebruiker();
          gebruiker.setVoornaam(voornaamInput.getText());
          gebruiker.setAchternaam(achternaamInput.getText());
          table.getItems().add(gebruiker);
  
          voornaamInput.clear();
          achternaamInput.clear();
      }
  
  //    Save button bij bewerken
  //TODO bewerken kan nog niet
      public void saveButtonEditClicked()
      {
          Gebruiker gebruiker = new Gebruiker();
          gebruiker.setVoornaam(voornaamInput.getText());
          table.getItems().add(gebruiker);
  
      }
  
  //    Verwijder button
      public void verwijderButtonClicked()
      {
          ObservableList&lt;Gebruiker&gt; gebruikerSelected, allGebruikers;
          allGebruikers = table.getItems();
          gebruikerSelected = table.getSelectionModel().getSelectedItems();
  
          gebruikerSelected.forEach(allGebruikers::remove);
      }
  
  
  
  }
  </code></pre>
  
  <p><strong><em>Gebruiker.java</em></strong></p>
  
  <pre><code>import javafx.beans.property.SimpleObjectProperty;
  import javafx.beans.property.SimpleStringProperty;
  
  import java.util.Date;
  
  public class Gebruiker
  {
  
      private String voornaam;
      private String achternaam;
  
      public Gebruiker(){
          this.voornaam = "";
          this.achternaam = "";
      }
  
      public Gebruiker(String voornaam, String achternaam){
          this.voornaam = voornaam;
          this.achternaam = achternaam;
      }
  
      public String getVoornaam() {
          return voornaam;
      }
  
      public void setVoornaam(String voornaam) {
          this.voornaam = voornaam;
      }
  
      public String getAchternaam() {
          return achternaam;
      }
  
      public void setAchternaam(String achternaam) {
          this.achternaam = achternaam;
      }
  }
  </code></pre>
  
  <p>CSV file
  <a href="https://i.stack.imgur.com/VKX3p.png" rel="nofollow noreferrer">CSV file</a>
  How it looks with "add" scene
  <a href="https://i.stack.imgur.com/BTgzX.png" rel="nofollow noreferrer">How it looks with "add" scene</a>
  Edit screen looks the same but the fields should then be filled and be able to be changed.</p>