# Tableview Daten hinzufügen und aktualisieren



## Jak111 (30. Jun 2016)

Hallo,

Ich versuche ein kleines Programm zu programmieren bei welchem man Artikel eintragen kann (in einem 2. Fenster) und diese dann in einer Tabelle (anderes Fenster) erfasst werden. Ich habe jedoch das Problem das neu eingetragene Artikel in der Tabelle nicht angezeigt werden. Wenn ich einen Artikel von Anfang an erstelle wird dieser jedoch in der Tabelle angezeigt z.B.
artikelList.add(new Artikel("TEST Artikel Name"," Test Beschreibung", 300));
Woran liegt das? Mir kommt es so vor als wie wenn ein neuer Artikel zwar erstellt wird, aber die Tabelle die Daten nicht aktualisiert und somit die neuen Artikel nicht angezeigt werden...

Erstes Fenster mit TableView:

```
public class MainWindowController {

    //Views
    @FXML public TableView <Artikel> tableView;
    @FXML public TableColumn <Artikel, String> artikelColumn;
    @FXML public TableColumn <Artikel, String> beschreibungColumn;
    @FXML public TableColumn <Artikel, Double> preisColumn;


    String artName;
    String artBeschreibung;
    Double artPreis;


    private Main main;
    private Stage primaryStage;

    public Artikel artikel;

    public ObservableList<Artikel> artikelList = FXCollections.observableArrayList();

    public void initialize(){


        artikelColumn.setCellValueFactory(new PropertyValueFactory<Artikel, String>("artikelName"));
        beschreibungColumn.setCellValueFactory(new PropertyValueFactory<Artikel, String>("beschreibung"));
        preisColumn.setCellValueFactory(new PropertyValueFactory<Artikel, Double>("preis"));


    }

    public void setMain(Main main, Stage primaryStage) { // Verbindung Main Class
        this.main = main;
        this.primaryStage = primaryStage;

        artikelList.add(new Artikel("test","beschreibung", 300));

        tableView.setItems(FXCollections.observableArrayList(artikelList));
    }

    @FXML
    public void onCloseStage() {
        primaryStage.close();
    }
    @FXML
    public void onAddArticle() {

        main.articleWindow();
    }
}
```

Artikel Klasse:

```
public class Artikel {
    private StringProperty artikelName;
    private StringProperty beschreibung;
    private DoubleProperty preis;

    public Artikel(String artikelName, String beschreibung, double preis) {
        this.artikelName = new SimpleStringProperty(artikelName);
        this.beschreibung = new SimpleStringProperty(beschreibung);
        this.preis = new SimpleDoubleProperty(preis);
    }

    //GETTER

    public String getArtikelName() {
        return artikelName.get();
    }

    public String getBeschreibung() {
        return beschreibung.get();
    }

    public double getPreis() {
        return preis.get();
    }


    //SETTER

    public void setArtikelName(String artikelName) {
        this.artikelName.set(artikelName);
    }

    public void setBeschreibung(String beschreibung) {
        this.beschreibung.set(beschreibung);
    }

    public void setPreis(double preis) {
        this.preis.set(preis);
    }


}
```

2. Fenster zum erstellen/eintragen der neuen Artikel:

```
public class AddArticleController {

    //Views
    @FXML private TextField txtArtikelName;
    @FXML private TextArea txtBeschreibung;
    @FXML private TextField txtPreis;

    String artName;
    String artBeschreibung;
    double artPreis;


    private ObservableList<Artikel> artikelList = FXCollections.observableArrayList();


    private Main main;
    private Stage secondaryStage;

    public Artikel artikel;

    public void setMain(Main main, Stage secondaryStage) { // Verbindung Main Class
        this.main = main;
        this.secondaryStage = secondaryStage;

    }

    @FXML
    public void goBack() {
        secondaryStage.close();


    }
    @FXML
    public void onAddArticle(){

        artikelList.add(new Artikel(txtArtikelName.getText(), txtBeschreibung.getText(), Double.parseDouble(txtPreis.getText())));

        System.out.println("Eingetragene Daten: " + artikelList.size());

        txtArtikelName.clear();
        txtBeschreibung.clear();
        txtPreis.clear();
    }

}
```

Danke für eure Hilfe!!


----------



## MichaProgs (1. Jul 2016)

Hi Jak,

versuch es mal hiermit:

tableView.getColumns().get(0).setVisible(false);
tableView.getColumns().get(0).setVisible(true);

Einfach nachdem du die Daten der obsList gegeben hast.

Gruß
TB94


----------



## Joose (1. Jul 2016)

Du erstellst in beiden Controllern eine Liste -> sprich du hast dann 2 Listen Objekte, wenn du einer etwas hinzufügst wie soll denn die andere das mitbekommen? 

Lösungansatz: Du musst das Listen Objekt aus deinem MainWindowController an denn AddArticleController übergeben


----------



## Jak111 (1. Jul 2016)

> Lösungansatz: Du musst das Listen Objekt aus deinem MainWindowController an denn AddArticleController übergeben



Wie gehe ich dabei am besten vor (vor allem um das MVC Modell einzuhalten). Muss ich im addArticelController mit MainWindowcontroller c = new MainWindowController() die Verbindung zum anderen Controller aufbauen und dann mit controller.artikelList.add(.....) die Liste füllen?

Danke für deine Hilfe!


----------



## MichaProgs (2. Jul 2016)

Ja, da hat der Joose wohl eher recht 
Ich hatte aber auch schon Probleme beim aktualisieren der Daten in der Liste und da hilft das mit dem setVisible().

Ich würde in der AddArtikel-Klasse eine Setter-Methode für die ObsList erstellen und dann entsprechend die bereits vorhandene ObsList übergeben um diese zu bearbeiten bzw. Daten hinzuzufügen.

Gruß
TB94


----------



## Jak111 (2. Jul 2016)

> Ich würde in der AddArtikel-Klasse eine Setter-Methode für die ObsList erstellen und dann entsprechend die bereits vorhandene ObsList übergeben um diese zu bearbeiten bzw. Daten hinzuzufügen.



Sorry wenn ich einfach zu dumm bin das zu kapieren, aber wie übergebe ich die vorhandene ObsLis ?

Hoffe du kannst mir helfen!


----------

