import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;

/*Based on SO Answer : https://stackoverflow.com/a/41663687/3992939   */
public class TableController {

    private final ObservableList<Item> items = FXCollections.observableArrayList();

    @FXML
    private void initialize() {
        items.setAll(createItems());
    }

    @FXML
    private void loadItems() {
        items.addAll(createMoreItems());
    }

    private List<Item> createItems() {
        return IntStream.rangeClosed(0, 9)
                .mapToObj(i -> "Item "+i)
                .map(Item::new)
                .collect(Collectors.toList());
    }
    private List<Item> createMoreItems() {
        return IntStream.rangeClosed(items.size(), items.size()+10)
                .mapToObj(i -> "Item "+i)
                .map(Item::new)
                .collect(Collectors.toList());
    }

    public ObservableList<Item> getItems() {
        return items ;
    }


    public static class Item {
        private final StringProperty name = new SimpleStringProperty();

        public Item(String name) {
            setName(name);
        }

        public final StringProperty nameProperty() {
            return name;
        }

        public final java.lang.String getName() {
            return nameProperty().get();
        }

        public final void setName(final java.lang.String name) {
            nameProperty().set(name);
        }
    }
}