# JavaFX TableView  cellValueFactory für Arrays



## Zant23 (30. Jun 2015)

Hallo liebe Java Freunde,

Direkt zu meinem Problem:

Ich habe bei JavaFx eine TableView erstellt und wollte diese mit SQL Daten füllen. Das abgreifen der Daten aus der Datenbank habe ich super hinbekommen, diese speichere ich dann in einer ObservableList in der die einzelnen Einträge jeweils aus Objekten bestehen, die die einzelnen Zellen der SQL Datenbank in einem Array abspeichern. Das Array ist mit einer VarArgs übergabe aus dem Konstruktor realisiert.

 Mein Ziel dabei war es so allgemein wie möglich zubleiben um auf jedes Tabellengröße reagieren zukönnen. 

Die Erzeugung der einzelnen Spalten funktioniert einwandfrei, das Befüllen der Zellen jedoch weniger. 

Da ich denke das der Wurm in meinem Code irgendwo an der Stelle der cellValueFactory ist hier die spezifische Frage: 
Wie realisiere ich die setcellValueFactory Methode für Zelldaten die in einem Array abgespeichert sind.

Hier noch mein Java code:


```
//Klasse TableRow hier werden die einzelnen Reihen aus der ausgelesenen SQL Tabelle gespeichert

package JavaFX.Pages.Controller;


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


public class TableRow {
   private final StringProperty[] row;


    public TableRow(String... cells){
        
        row = new StringProperty[cells.length];
        for(int i=0;i<cells.length;i++)
        {
            row[i] = new SimpleStringProperty(cells[i]);
        }
               
    }
    
    public StringProperty[] getRow() {
        return row;
    }
    
    public int getRowSize(){
        return row.length;
    }
    
    public StringProperty getCell(int i){
       return row[i-1];
    }
}


//Die Klasse TableViewManager erzeugt die ObeservableList in der die einzelnen TableRows gespeichert sind anhand des im Konstruktor übergebenen Resultset aus der SQL Datenbank. Außerdem berechnet sie noch die Tabellengröße

public class TableViewManager {


    private final ResultSet myResultSet;
    private final int COLUMN_SIZE;
    private final int ROW_SIZE;


    private ObservableList<TableRow> resultList = FXCollections.observableArrayList();


    
    public TableViewManager(ResultSet rs) {
        myResultSet = rs;
        //Count the columns in Parameter ResultSet
        int columncounter = 1;
        try {
            rs.beforeFirst();
            rs.next();
            for (columncounter = 1; true; columncounter++) {
                rs.getObject(columncounter);
            }
        } catch (Exception ex) {


            //Column Size übergeben
            COLUMN_SIZE = (columncounter - 1);


        }


        //Count the rows in Parameter ResultSet
        int rowcounter = 0;
        try {
            rs.beforeFirst();
            while (rs.next()) {
                rowcounter++;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TableViewManager.class.getName()).log(Level.SEVERE, null, ex);
            rowcounter = 0;
            
        }
        //Row Size initizialisieren
        ROW_SIZE = rowcounter;


        //Making the TableRow Objects and connection it to the list
        String[] cells;


        try {


            rs.beforeFirst();
            while (rs.next()) {
                cells = new String[COLUMN_SIZE];


                for (int i = 0; i < COLUMN_SIZE; i++) {
                    cells[i] = rs.getString((i + 1));
                }


                resultList.add(new TableRow(cells));
            }


        } catch (SQLException ex) {
            Logger.getLogger(TableViewManager.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
    
    
    public int getCOLUMN_SIZE() {
        return COLUMN_SIZE;
    }


    public int getROW_SIZE() {
        return ROW_SIZE;
    }


    public ObservableList<TableRow> getResultList() {
        return resultList;
    }


    public ResultSet getMyResultSet() {
        return myResultSet;
    }




}




//Die abstrakte Klasse ControlledScreen erbt jede Screen Klasse und die Methode showResultSet on Screen führ durch das übergebene ResultSet und TableView eine veränderung der ahand der obigen Klassen durch sodass die SQL Daten auf dem Screen angezeigt werden sollten.

Die für mich kritische Stelle habe ist Zeile 189

package JavaFX.Pages.Controller;


import java.sql.ResultSet;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Callback;



public abstract class ControlledScreen {




    protected ScreenController myScreenController;
    protected TableColumn<TableRow,String>[] tablecolumns;




    protected final TableView<TableRow> showResultSetonTableView(ResultSet rs,             TableView<TableRow>table) {


        //Creating a new viewManager 
        TableViewManager viewManager = new TableViewManager(rs);
        tablecolumns = new TableColumn[viewManager.getCOLUMN_SIZE()];
        ObservableList<TableRow> list = viewManager.getResultList();
        table.getColumns().clear();


        for (int i = 0; i < viewManager.getCOLUMN_SIZE(); i++) {
            tablecolumns[i] = new TableColumn();
            tablecolumns[i].setText("Column " + (i + 1));
            tablecolumns[i].setCellValueFactory(new PropertyValueFactory<TableRow,String>("row["+i+"]"));
            
        }
        table.getColumns().addAll(tablecolumns);
        table.setItems(viewManager.getResultList());
        
        return table;


    }
}
```


Ich hoffe jemand weiß eine Lösung ich bin nämlich schon seit Wochen ratlos auf der Suche nach einer Lösung durchs Internet gesurft. 

Fragen oder Anregungen zum Code könnt ihr auch gerne posten.

Liebe Grüße

Zant


----------



## MattElg (28. Sep 2016)

Hallo, ich sehe Deine Klasse. Ähnliches habe ich auch vor. Eine MySQL Tabelle in ein Array lesen. Habe ich, wobei die Zeile 0 dieses Array die Spaltennamen sind.
Dieses dann direkt in ein TableView.
Nun habe ich die Spaltennamen definiert. Dies klappt auch. 
Aber ich muss noch der TableView Werte zuweisen, also alles ab Zeile 1 meines Arrays, den entsprechenden Spalten. 
Das klappt nicht. Derzeit bekomme ich nur eine Tabelle mit Überschriften und ohne Inhalt angezeigt.


----------



## thet1983 (28. Sep 2016)

Geht einfacher auch:
http://www.sicusoft.at/SiCuSoft-Java-Tutorials/Java-Persistence-JPA/JPA-Tutorial-TableView/desktop/


----------

