Tableview mit FXML

Liebe Forumgemeinde,

ich habe versucht ein ähnliches Programm wie im Beispiel auf der Javaseite Mastering FXML: Creating an Address Book with FXML | JavaFX 2 Tutorials and Documentation zu schreiben.
In diesem Beispiel wird die Tabelle aber bereits mit Inhalten zu Beginn über FXML gefüllt.
Ich möchte aber mit einer leeren Tabelle beginnen und später aus einer csv-Datei den Inhalt einlesen.

Leider bleibt die Tabelle leer, wenn ich auf “neu” klicke.

Im Beispiel lautet der Code folgendermaßen:
(Example 4-6)


</columns>
<items>
    <FXCollections fx:factory="observableArrayList">
        <Person firstName="Jacob" lastName="Smith"  
             email="jacob.smith@example.com"/>
        <Person firstName="Isabella" lastName="Johnson" 
             email="isabella.johnson@example.com"/>
        <Person firstName="Ethan" lastName="Williams" 
             email="ethan.williams@example.com"/>
        <Person firstName="Emma" lastName="Jones"
             email="emma.jones@example.com"/>
        <Person firstName="Michael" lastName="Brown" 
             email="michael.brown@example.com"/>
    </FXCollections>
</items>
</TableView>

Mein Verständnis ist, dass ich hier mit einer bestimmten Syntax mitteilen muss, dass ich ein Objekt vom Typ Person benutze will. Im Beispiel werden ja bereits Instanzen davon erzeugt und lediglich welche angehangen.

Weiter unten im Beispiel wird der Inhalt des Arrays zunächst eingelesen. Ich gehe davon aus, dass hier auch eine Änderung erfolgen muss, denn sonst greift man auf ein Objekt zu, welches zu Beginn ja nicht besteht.

mein Code:
meinDepot.java

package meindepot;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author ---
 */
public class MeinDepot extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        
        Scene scene = new Scene(root);
        
        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}```

FXMLDocumentController.java
(Zeile 26 und 27 geändert, um ein leeres ObservableArray anzulegen)

package meindepot;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;

/**
*

  • @author
    */
    public class FXMLDocumentController implements Initializable {

    @FXML private TableView tableView;
    @FXML private TextField isinTextfield;
    @FXML private TextField nameTextfield;

    List list = new ArrayList();
    ObservableList data = FXCollections.observableArrayList(list);

    @FXML
    private void addWertpapier(ActionEvent event) {
    data.add(new Wertpapier(isinTextfield.getText(), nameTextfield.getText()));

     isinTextfield.setText("");
     nameTextfield.setText("");
     
     System.out.println("Wertpapier hinzugefügt");
    

    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    // TODO
    }

}```

FXMLDocument.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.collections.*?>
<?import meindepot.*?>

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
    xmlns:fx="http://javafx.com/fxml"
    fx:controller="meindepot.FXMLDocumentController">
    <padding>
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
    </padding>
    <Label style="-fx-font: NORMAL 20 Tahoma;" text="Wertpapiere" GridPane.columnIndex="0" GridPane.rowIndex="0">
    </Label>
    <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex = "1">
        <columns>
            <TableColumn fx:id="isinNummerSpalte" text="ISIN" prefWidth="100">
                <cellValueFactory>
                    <PropertyValueFactory property ="isinNummer" />
                </cellValueFactory>
            </TableColumn>
            <TableColumn text="Wertpapiername" prefWidth="100">
                <cellValueFactory>
                    <PropertyValueFactory property="wertpapiername" />
                </cellValueFactory>
            </TableColumn>
        </columns>
        <items>
            <FXCollections fx:factory="observableArrayList">
             
            </FXCollections>
        </items>
        <sortOrder>
            <fx:reference source="isinNummerSpalte"/>
        </sortOrder>
    </TableView>
    <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="0" GridPane.rowIndex="2">
        <TextField fx:id="isinTextfield" promptText="ISIN" prefWidth="90"/>
        <TextField fx:id="nameTextfield" promptText="Wertpapiername" prefWidth="90"/>
        <Button text = "Neu" onAction="#addWertpapier"/>
    </HBox> 
</GridPane>

Wertpapier.java

package meindepot;

import javafx.beans.property.SimpleStringProperty;

/**
 *
 * @author ---
 */
public class Wertpapier {
    private final SimpleStringProperty isinNummer = new SimpleStringProperty("");
    private final SimpleStringProperty wertpapiername = new SimpleStringProperty("");
    
    public Wertpapier() {
        this("", "");
    }
    
    public Wertpapier(String isin, String name) {
        setIsinNummer(isin);
        setWertpapiername(name);
    }
    
    public String getIsinNummer(){
        return isinNummer.get();
    }
    
    public void setIsinNummer(String iNummer){
        isinNummer.set(iNummer);
    }
    
    public String getWertpapiername(){
        return wertpapiername.get();
    }
    
    public void setWertpapiername(String name){
        wertpapiername.set(name);
    }
    
}

Dies ist mein erstes Javaprogramm. Ich habe Amateurkenntnisse in C++ mit Qt und würde mich freuen, wenn mir jemand die richtige Richtung weist.
Vielen Dank!