# Text im Tetfeld in einer TableView darstellen



## busgi (18. Mrz 2019)

Hallo zusammen,

habe ein kleines Problem.
Ich erstelle mit einem "+"- Button beliebig viele Textfelder. Die Texte in den Textfeldern möchte ich mit einem "Erstellen"-Button in einer TableView anzeigen lassen.
Ich habe schon rumprobiert aber leider ist es mir nicht gelungen eine logische Lösung zu finden, da ich diesen Code benutzt habe um Textfelder zu erzeigen.

addTextFieldButton.setOnAction(e -> hbox2.getChildren().add(new TextField()));

also haben die einzelnen Textfelder natürlich auch keine spezielle variablen.

Unten seht ihr ein Bild wie die GUI momentan aussieht.

mit dem addButton möchte ich die einzelnen Texte in den Spalten angezeigt bekommen.

Mein Code:


```
package Tableview;
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.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;

import javafx.stage.Stage;

public class CreateScheme extends Application {

    // Variablen

    @Override
    public void start(Stage secondStage) throws Exception {

        // Scene / root
        Pane pane = new Pane(); // Layout -> alle Elmente haben die Position 0/0
        Scene scene = new Scene(pane, 800, 600);

        // Variablen erstellen
        VBox vbox = new VBox();
        VBox vbox2 = new VBox();
        HBox hbox = new HBox();
        HBox hbox2 = new HBox();
        HBox hbox3 = new HBox();
        Label label = new Label("Bewertungsschema erstellen: ");
        Button button = new Button("New");
        TextField textField1 = new TextField();
        CheckBox checkbox = new CheckBox();
        Button addButton = new Button("Erstellen");
        Button cancelButton = new Button("Abbrechen");
        Button saveButton = new Button("Speichern");
        Button addTextFieldButton = new Button("+");
        TableView<Model> tableview = new TableView<Model>();
        TableColumn<Model, String> table1 = new TableColumn<Model, String>("Table1");
        TableColumn<Model, String> table2 = new TableColumn<Model, String>("Table2");
        TableColumn<Model, String> table3 = new TableColumn<Model, String>("Table3");
        TableColumn<Model, String> table4 = new TableColumn<Model, String>("Table4");
        TableColumn<Model, String> table5 = new TableColumn<Model, String>("Table5");
  
      
        ObservableList<Model> list = Listen.getUserList();
        tableview.setItems(list);
        tableview.setEditable(true);
        tableview.getColumns().addAll(table1, table2, table4, table5, table3);
        table1.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
        table2.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
        table3.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
        table4.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
        table5.setCellFactory(TextFieldTableCell.<Model>forTableColumn());

        textField1.setVisible(false);
        checkbox.setVisible(false);
        vbox2.setVisible(false);

        hbox.setSpacing(10.0);
        hbox.getChildren().addAll(button, textField1, checkbox);

        vbox.setLayoutX(10.0);
        vbox.setLayoutY(30.0);
        vbox.setSpacing(30.0);
        vbox.setPadding(new Insets(10.0, 20.0, 30.0, 10.0));
        vbox.getChildren().addAll(label, hbox);

        vbox2.setLayoutX(300.0);
        vbox2.setLayoutY(30.0);
        vbox2.setSpacing(30.0);
        vbox2.setMaxHeight(200.0);
        vbox2.setPadding(new Insets(50.0, 30.0, 30.0, 30.0));
        vbox2.getChildren().add(tableview);

        hbox2.setLayoutX(10.0);
        hbox2.setLayoutY(500.0);
        hbox2.setSpacing(20.0);
      
        hbox3.setLayoutX(10.0);
        hbox3.setLayoutY(550.0);
        hbox3.setSpacing(20.0);
        hbox3.getChildren().addAll(addButton, cancelButton, saveButton, addTextFieldButton);

        button.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                textField1.setVisible(true);
                checkbox.setVisible(true);
            }
        });

        checkbox.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                vbox2.setVisible(true);
                textField1.setEditable(false);
            }
        });

        addTextFieldButton.setOnAction(e -> hbox2.getChildren().add(new TextField()));
      
      
        addButton.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                  
                    //list.add(new Model();
                    tableview.refresh();
                }
        });
      
  
        pane.getChildren().addAll(vbox, vbox2, hbox2, hbox3);

        scene.getStylesheets().add("style.css");
        secondStage.setTitle("GBO-Tool");
        secondStage.setScene(scene);
        secondStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
```


```
package Tableview;

import javafx.beans.property.SimpleStringProperty;

public class Model {

    private SimpleStringProperty table1;
    private SimpleStringProperty table2;
    private SimpleStringProperty table3;
    private SimpleStringProperty table4;
    private SimpleStringProperty table5;
  
  
    public Model(String table1, String table2, String table3, String table4, String table5) {
        this.table1 = new SimpleStringProperty(table1);
        this.table2 = new SimpleStringProperty(table2);
        this.table3 = new SimpleStringProperty(table3);
        this.table4 = new SimpleStringProperty(table4);
        this.table5 = new SimpleStringProperty(table5);
    }

    // Getter Setter
    public String getTable1() {
        return table1.get();
    }

    public void setTable1(SimpleStringProperty table1) {
        this.table1 = table1;
    }

    public String getTable2() {
        return table2.get();
    }

    public void setTable2(SimpleStringProperty table2) {
        this.table2 = table2;
    }

    public String getTable3() {
        return table3.get();
    }

    public void setTable3(SimpleStringProperty table3) {
        this.table3 = table3;
    }

    public String getTable4() {
        return table4.get();
    }

    public void setTable4(SimpleStringProperty table4) {
        this.table4 = table4;
    }
  
    public String getTable5() {
        return table5.get();
    }

    public void setTable5(SimpleStringProperty table5) {
        this.table5 = table5;
    }

    public void setTable1(String newValue) {
        // TODO Auto-generated method stub
      
    }
    public void setTable2(String newValue) {
        // TODO Auto-generated method stub
      
    }
    public void setTable3(String newValue) {
        // TODO Auto-generated method stub
      
    }
    public void setTable4(String newValue) {
        // TODO Auto-generated method stub
      
    }
    public void setTable5(String newValue) {
        // TODO Auto-generated method stub
      
    }
}
```

Freue mich auf Vorschläge und Tipps.
Danke


----------



## Robat (18. Mrz 2019)

Möchtest du der Tabelle einfach nur einen neuen Datensatz hinzufügen, sobald auf den + Button gedrückt wird?


----------



## busgi (19. Mrz 2019)

Robat hat gesagt.:


> Möchtest du der Tabelle einfach nur einen neuen Datensatz hinzufügen, sobald auf den + Button gedrückt wird?



Mit dem + button füge ich Textfelder hinzu. Die Daten in dem Textfeld soll mit dem Button "Erstellen" auf der TableView angezeigt werden.


----------



## mihe7 (19. Mrz 2019)

D. h. mit dem + button willst Du Spalten zur Tabelle hinzufügen und mit Erstellen fügst Du einen Datensatz zur Tabelle hinzu?


----------



## busgi (19. Mrz 2019)

mihe7 hat gesagt.:


> D. h. mit dem + button willst Du Spalten zur Tabelle hinzufügen und mit Erstellen fügst Du einen Datensatz zur Tabelle hinzu?



nein. mit dem + button erzeuge ich unten die textfelder. die daten (_text_) in den textfeldern, sollen mit dem "erstellen" button in der tableview angezeigt werden.

siehe oben das bild. dort habe ich es markiert.


by the way. kann ich auch beliebig viele spalten in eine tableview einfügen? je nachdem wieviel ich brauche?


----------



## mihe7 (19. Mrz 2019)

busgi hat gesagt.:


> siehe oben das bild. dort habe ich es markiert.


Ich sehe dort unten vier Textfelder und in der Tabelle fünf Spalten. Was soll denn rauskommen, wenn ich in die Textfelder der Reihe nach T1, T2, T3 und T4 eintrage und dann auf "Erstellen" klicke?


----------



## busgi (19. Mrz 2019)

mihe7 hat gesagt.:


> Ich sehe dort unten vier Textfelder und in der Tabelle fünf Spalten. Was soll denn rauskommen, wenn ich in die Textfelder der Reihe nach T1, T2, T3 und T4 eintrage und dann auf "Erstellen" klicke?



mit dem + button kann ich auch fünf textfelder erstellen. das ist nicht entscheidend. 
ich zeige es anhand eines bildes. siehe unten. mit dem erstellen button wird der text in den textfeldern im tableview angezeigt. ich weiß nicht wie ich es anders erklären soll. die aufgabenstellung ist ganz klar. ich wiederhole mich nur noch


----------



## mihe7 (19. Mrz 2019)

Und was passiert, wenn Du mit dem "+" sechs Textfelder erstellst (Nachtrag: und natürlich ausfüllst)? Du hast in der Tabelle ja nur 5 Spalten.


----------



## busgi (19. Mrz 2019)

mihe7 hat gesagt.:


> Und was passiert, wenn Du mit dem "+" sechs Textfelder erstellst (Nachtrag: und natürlich ausfüllst)? Du hast in der Tabelle ja nur 5 Spalten.



ich brauche maximal nur fünf. aber es wäre natürlich auch toll wenn ich die anzahl der spalten beliebig auswählen könnte. mit einer eingabe am besten. ich frage mich ob das überhaupt gehen würde. das ist aber jetzt nicht das eigentlich problem.


----------



## mihe7 (19. Mrz 2019)

Ich verstehe zwar den ganzen Aufwand nicht, aber ich würde folgendes versuchen: 
1. ein Model-Objekt verwenden
2. beim "+" neues Textfeld erstellen und an die betreffende Property binden
3. beim Erstellen eine Kopie des Model-Objekts der ObservableList hinzufügen und
4. das Model-Objekt zurücksetzen


----------



## busgi (19. Mrz 2019)

mihe7 hat gesagt.:


> Ich verstehe zwar den ganzen Aufwand nicht, aber ich würde folgendes versuchen:
> 1. ein Model-Objekt verwenden
> 2. beim "+" neues Textfeld erstellen und an die betreffende Property binden
> 3. beim Erstellen eine Kopie des Model-Objekts der ObservableList hinzufügen und
> 4. das Model-Objekt zurücksetzen




Danke für die Tipps. Ich werde das Ganze mal versuchen auszuprobieren und weiter recherchieren


----------



## mihe7 (19. Mrz 2019)

Hab mal etwas zusammengeschustert (Achtung: das ist wirklich ein Flickwerk)


Spoiler: CreateScheme.java





```
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.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;

import javafx.stage.Stage;

public class CreateScheme extends Application {

    private Model model;

    // Variablen

    @Override
    public void start(Stage secondStage) throws Exception {

        // Scene / root
        Pane pane = new Pane(); // Layout -> alle Elmente haben die Position 0/0
        Scene scene = new Scene(pane, 800, 600);

        // Variablen erstellen
        VBox vbox = new VBox();
        VBox vbox2 = new VBox();
        HBox hbox = new HBox();
        HBox hbox2 = new HBox();
        HBox hbox3 = new HBox();
        Label label = new Label("Bewertungsschema erstellen: ");
        Button button = new Button("New");
        TextField textField1 = new TextField();
        CheckBox checkbox = new CheckBox();
        Button addButton = new Button("Erstellen");
        Button cancelButton = new Button("Abbrechen");
        Button saveButton = new Button("Speichern");
        Button addTextFieldButton = new Button("+");
        TableView<Model> tableview = new TableView<Model>();

        ObservableList<Model> list = FXCollections.observableArrayList();

        model = new Model();
        model.addListener(e -> {
            while (e.next()) {
                if (e.wasAdded()) {
                    int ix = model.size() - 1;
                    for (Model m : list) {
                        if (m.size() <= ix) {
                            m.add("");
                        }
                    }
                    TableColumn<Model, String> column = new TableColumn<Model, String>("Table" + (ix+1));
                    column.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
                    column.setCellValueFactory(feature -> feature.getValue().get(ix));
                    tableview.getColumns().add(column);
                }
            }
        });

        tableview.setItems(list);
        tableview.setEditable(true);

        textField1.setVisible(false);
        checkbox.setVisible(false);
        vbox2.setVisible(false);

        hbox.setSpacing(10.0);
        hbox.getChildren().addAll(button, textField1, checkbox);

        vbox.setLayoutX(10.0);
        vbox.setLayoutY(30.0);
        vbox.setSpacing(30.0);
        vbox.setPadding(new Insets(10.0, 20.0, 30.0, 10.0));
        vbox.getChildren().addAll(label, hbox);

        vbox2.setLayoutX(300.0);
        vbox2.setLayoutY(30.0);
        vbox2.setSpacing(30.0);
        vbox2.setMaxHeight(200.0);
        vbox2.setPadding(new Insets(50.0, 30.0, 30.0, 30.0));
        vbox2.getChildren().add(tableview);

        hbox2.setLayoutX(10.0);
        hbox2.setLayoutY(500.0);
        hbox2.setSpacing(20.0);
     
        hbox3.setLayoutX(10.0);
        hbox3.setLayoutY(550.0);
        hbox3.setSpacing(20.0);
        hbox3.getChildren().addAll(addButton, cancelButton, saveButton, addTextFieldButton);

        button.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                textField1.setVisible(true);
                checkbox.setVisible(true);
            }
        });

        checkbox.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                vbox2.setVisible(true);
                textField1.setEditable(false);
            }
        });

        addTextFieldButton.setOnAction(e -> {
            TextField tf = new TextField();
            int ix = model.size();
            model.add("");
            tf.textProperty().bindBidirectional(model.get(ix));
            hbox2.getChildren().add(tf);
        });
     
     
        addButton.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                model.addTo(list);
                model.reset();
            }
        });
     
 
        pane.getChildren().addAll(vbox, vbox2, hbox2, hbox3);

        scene.getStylesheets().add("style.css");
        secondStage.setTitle("GBO-Tool");
        secondStage.setScene(scene);
        secondStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
```






Spoiler: Model.java





```
import javafx.beans.property.Property;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.beans.property.SimpleStringProperty;
import java.util.List;

public class Model {
    private final ObservableList<SimpleStringProperty> properties = FXCollections.observableArrayList();

    public void addListener(ListChangeListener<? super SimpleStringProperty> listener) {
        properties.addListener(listener);
    }

    public void add(String value) { properties.add(new SimpleStringProperty(value)); }    
    public int size() { return properties.size(); }
    public Property<String> get(int ix) { return properties.get(ix); }

    public void addTo(List<Model> list) {
        Model copy = new Model();
        for (SimpleStringProperty prop : properties) {
            copy.add(prop.getValue());
        }
        list.add(copy);
    }

    public void reset() {
        for (SimpleStringProperty prop : properties) {
            prop.setValue("");
        }
    }
}
```


----------



## busgi (20. Mrz 2019)

Wow danke. ich werde es mal ausprobieren. Melde mich wenn ich Schwierigkeiten habe


----------



## busgi (20. Mrz 2019)

@mihe7  hast mir den tag gerettet. Es funktioniert alles. Vielen Dank dafür


----------



## busgi (20. Mrz 2019)

@mihe kannst du vielleicht erklären, was das hier genau macht?
for (Model m : list) {
                        if (m.size() <= ix) {
                            m.add("");
                        }

komme leider nicht drauf.


----------



## mihe7 (20. Mrz 2019)

Klar. Dazu muss ich ein bisschen ausholen. Wenn Du auf "+" drückst, fügst Du dem Model-Objekt der Anwendung eine StringProperty hinzu, erzeugst ein neues Textfeld und bindest dieses an die neue StringProperty. Damit ist das Thema für die Textfelder erledigt. 

Um die Tabelle zu behandeln, wird beim Model ein Listener registriert. Der hat die Aufgabe, der Tabelle eine neue Spalte hinzuzufügen. Problem: in list befinden sich zu dem Zeitpunkt Model-Objekte mit weniger Properties (=Spalten). Daher füge ich vorher jedem Model in der List einen leeren String hinzu.


```
for (Model m : list) {    // wiederhole für jedes Model-Objekt (m) der Liste list
    if (m.size() <= ix) { // falls im Model-Objekt m eine Propery zu wenig vorhanden ist...
        m.add("");        // ... füge m ein neue Property (leerer String) hinzu
    }
}
```

Hierzu vier Anmerkungen: erstens könnte man auch die Textfelder über den (oder einen) Listener erschlagen. Zweitens ist viel interessanter: die if-Abfrage ist streng genommen unsinnig. 

Entweder kann ich davon ausgehen, dass die Model-Objekte in der Liste immer genau eine Property zu wenig haben (es wurde ja gerade erst eine neue hinzugefügt), dann brauche ich die if-Abfrage nicht. Oder aber ich muss davon ausgehen, dass sich die Model-Objekte in der Liste auch um mehr als nur eine Property unterscheiden könnten. Dann dürfte ich keine if-Abfrage verwenden sondern bräuchte eine Schleife. 

Drittens bräuchte es das vermutlich alles nicht, wenn man die TableCellValueFactory richtig setzt (prüfen, ob ix >= size ist, falls ja, eine ReadOnlyStringProperty (leerer String) zurückgeben, sonst die Property aus dem Model).

Viertens: mir gefällt das alles nicht (Flickwerk).


----------



## busgi (21. Mrz 2019)

Danke für die Antwort. 

Ich verstehe es wenn es dir nicht gefällt. Meine Schwäche ist eher das Ganze allgemein zu halten. Ich würde auch gerne eine normale Model-Klasse mit normalen Gettern und Settern verwenden. Leider ist aber die Aufgabe, dass ich die GUI dynamisch und benutzerfreundlich halten muss.

Vielen Dank für die Mühe


----------



## mihe7 (21. Mrz 2019)

busgi hat gesagt.:


> Ich verstehe es wenn es dir nicht gefällt.


Ich glaube, Du meinst was anderes als ich  Mir geht es nicht um Deine Anforderungen, sondern um meine Umsetzung unter JavaFX. Vielleicht schaue ich mir das nochmal an.


----------



## dzim (21. Mrz 2019)

Ich hätte es auch anders gemacht, aber ich glaube, dass sich @mihe7 hier ganz tapfer als Helfer schlägt.  Daher hab ich das Thema auch aussen vor gelassen.


----------



## mihe7 (21. Mrz 2019)

Das hast Du aber nett formuliert  

Überlegung wäre die, dass man das Problem erst einmal vernünftig modelliert. Dabei käme ein Interface ähnlich zu Swing's TableModel heraus. Das wäre dann an die View inkl. TableView anzubinden. Mir ist nur noch nicht ganz klar, wie man letzteres in JavaFX bewerkstelligt, ohne sich die Finger wund zu schreiben


----------



## dzim (22. Mrz 2019)

Ok, dann mal Ärmel hoch und los geht's. Ich hab mal mein eines TableView-Beispiel aktualisiert, das war noch sehr... ähm... primitiv.

Main-Klasse: https://github.com/bgmf/poc/blob/up...ain/java/eu/dzim/tests/fx/MainTableTest2.java

```
package eu.dzim.tests.fx;

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

import java.io.IOException;

public class MainTableTest2 extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Table Test 2");
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainTableTest2.class.getResource("/fxml/TableTest2.fxml"));
            Pane rootLayout = loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

FXML: https://github.com/bgmf/poc/blob/up...ts-fx/src/main/resources/fxml/TableTest2.fxml

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

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="eu.dzim.tests.fx.controller.TableTest2Controller">

    <center>
        <TabPane fx:id="tabPane" tabClosingPolicy="UNAVAILABLE">
            <Tab fx:id="tab1" text="Table">
                <VBox>
                    <TableView fx:id="tableView">
                        <columns>
                            <TableColumn fx:id="tableColumnText" text="Text" prefWidth="150"/>
                            <TableColumn fx:id="tableColumnFlag1" text="Flag 1" prefWidth="50"/>
                            <TableColumn fx:id="tableColumnFlag2" text="Flag 2" prefWidth="50"/>
                            <TableColumn fx:id="tableColumnFlag3" text="Flag 3" prefWidth="50"/>
                        </columns>
                    </TableView>
                </VBox>
            </Tab>
            <Tab fx:id="tab2" text="Data">
                <GridPane hgap="5" vgap="5">
                    <Label text="Text:" GridPane.columnIndex="0" GridPane.rowIndex="0"/>
                    <Label text="Flag 1:" GridPane.columnIndex="0" GridPane.rowIndex="1"/>
                    <Label text="Flag 2:" GridPane.columnIndex="0" GridPane.rowIndex="2"/>
                    <Label text="Flag 3:" GridPane.columnIndex="0" GridPane.rowIndex="3"/>
                    <TextField fx:id="textField" promptText="some text" GridPane.columnIndex="1" GridPane.rowIndex="0"/>
                    <CheckBox fx:id="checkBox1" GridPane.columnIndex="1" GridPane.rowIndex="1"/>
                    <CheckBox fx:id="checkBox2" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
                    <CheckBox fx:id="checkBox3" GridPane.columnIndex="1" GridPane.rowIndex="3"/>
                    <Separator GridPane.columnIndex="0" GridPane.rowIndex="4" GridPane.columnSpan="2"/>
                    <Button fx:id="button" text="Submit" GridPane.columnIndex="0" GridPane.rowIndex="5" GridPane.columnSpan="2"/>
                </GridPane>
            </Tab>
        </TabPane>
    </center>
</BorderPane>
```

Controller: https://github.com/bgmf/poc/blob/up...tests/fx/controller/TableTest2Controller.java

```
package eu.dzim.tests.fx.controller;

import eu.dzim.tests.fx.model.TableTest2Model;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;

public class TableTest2Controller {

    @FXML private TabPane tabPane;
    @FXML private Tab tab1;
    @FXML private TableView<TableTest2Model> tableView;
    @FXML private TableColumn<TableTest2Model, String> tableColumnText;
    @FXML private TableColumn<TableTest2Model, Boolean> tableColumnFlag1;
    @FXML private TableColumn<TableTest2Model, Boolean> tableColumnFlag2;
    @FXML private TableColumn<TableTest2Model, Boolean> tableColumnFlag3;
    @FXML private Tab tab2;
    @FXML private TextField textField;
    @FXML private CheckBox checkBox1;
    @FXML private CheckBox checkBox2;
    @FXML private CheckBox checkBox3;
    @FXML private Button button;

    @FXML
    private void initialize() {

        System.err.println("#init");

        tableView.setItems(FXCollections.observableArrayList());

        tableColumnText.setCellValueFactory(new PropertyValueFactory<>("text"));
        tableColumnFlag1.setCellValueFactory(new PropertyValueFactory<>("flag1"));
        tableColumnFlag2.setCellValueFactory(new PropertyValueFactory<>("flag2"));
        tableColumnFlag3.setCellValueFactory(new PropertyValueFactory<>("flag3"));

        button.setOnAction(actionEvent -> {

            TableTest2Model model = new TableTest2Model();
            model.setText(textField.getText());
            model.setFlag1(checkBox1.isSelected());
            model.setFlag2(checkBox2.isSelected());
            model.setFlag3(checkBox3.isSelected());

            tableView.getItems().add(model);

            actionEvent.consume();
        });
    }
}
```

Model: https://github.com/bgmf/poc/blob/up...a/eu/dzim/tests/fx/model/TableTest2Model.java

```
package eu.dzim.tests.fx.model;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class TableTest2Model {

    private StringProperty text = new SimpleStringProperty(this, "text", "");
    private BooleanProperty flag1 = new SimpleBooleanProperty(this, "flag1", false);
    private BooleanProperty flag2 = new SimpleBooleanProperty(this, "flag2", false);
    private BooleanProperty flag3 = new SimpleBooleanProperty(this, "flag2", false);

    public final StringProperty textProperty() {
        return this.text;
    }

    public final String getText() {
        return this.textProperty().get();
    }

    public final void setText(final String text) {
        this.textProperty().set(text);
    }

    public final BooleanProperty flag1Property() {
        return this.flag1;
    }

    public final boolean isFlag1() {
        return this.flag1Property().get();
    }

    public final void setFlag1(final boolean flag) {
        this.flag1Property().set(flag);
    }

    public final BooleanProperty flag2Property() {
        return this.flag2;
    }

    public final boolean isFlag2() {
        return this.flag2Property().get();
    }

    public final void setFlag2(final boolean flag) {
        this.flag2Property().set(flag);
    }

    public final BooleanProperty flag3Property() {
        return this.flag3;
    }

    public final boolean isFlag3() {
        return this.flag3Property().get();
    }

    public final void setFlag3(final boolean flag) {
        this.flag3Property().set(flag);
    }
}
```

Modell also nicht resetten, sondern neu instantiieren. Der Rest ist eigentlich recht "straight forward", denke ich.


----------

