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:
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
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:
Java:
//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
Zuletzt bearbeitet: