2017-05-11 1 views
-1

Nach Stunden des Versuchens bin ich nah an meinem Deadline für ein Projekt und habe immer noch keine Lösung für mein ziemlich einfaches Problem bekommen. Ich brauche eine Tableview mit Daten aus SQL-Abfrage zu füllen, aber ich kann es nicht einmal zu arbeiten, wenn ich Online-Beispiele kopieren und einfügen ... Ich brauche das gleiche Ergebnis wie der folgenden CodeBrauchen Sie Hilfe bei der Konvertierung von DefaultTableModel in Tabellenansicht JavaFX

public DefaultTableModel buildTableModel() { 
     ResultSetMetaData metaData; 
     try (Connection conn = DriverManager.getConnection(MapperConfig.JDBC_URL)) { 
      PreparedStatement queryOpgeslagenGames = conn.prepareStatement(""); 
      ResultSet rs = queryOpgeslagenGames.executeQuery("SELECT spellen.spelID, spellen.spelNaam AS 'Naam van Spel', group_concat(naam separator ', ') AS 'Deelnemende spelers' FROM spellen RIGHT JOIN spelers ON spellen.spelID =  spelers.spelID GROUP BY spellen.spelID"); 
      metaData = rs.getMetaData(); 
      // names of columns 
      Vector<String> columnNames = new Vector<String>(); 
      int columnCount = metaData.getColumnCount(); 
      for (int column = 1; column <= columnCount; column++) { 
       columnNames.add(metaData.getColumnName(column)); 
      } 

      // data of the table 
      Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
      while (rs.next()) { 
       Vector<Object> vector = new Vector<Object>(); 
       for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
        vector.add(rs.getObject(columnIndex)); 
       } 
       data.add(vector); 
      } 
     return new DefaultTableModel(data, columnNames); 
     } catch (SQLException ex) { 
      for (Throwable t : ex) { 
       t.printStackTrace(); 
      } 
     } 
     return new DefaultTableModel(); 
    } 

aber da ich brauche Um es in JavaFX zu verwenden, kann ich Jtable nicht verwenden und muss Tabellenansicht verwenden. Kann jemand den Code für mich konvertieren? oder sagen Sie mir, wie Sie mit DefaultTableModel eine Tabellenansicht erstellen können?

Die Tabelle hat immer 3 Spalten, die erste ist die GameID, die zweite ist der Dateiname der Spielspeicherung und die dritte eine Sammlung von Namen von den Leuten im Spiel.

+1

Aus der SQL-Anweisung, es sieht aus wie Sie wissen, wie viele Spalten, die Sie haben werden, und was in diesen Spalten die Daten darstellen. Ist das korrekt? Wenn ja, können Sie diese Informationen explizit in die Frage aufnehmen? (BTW, ich denke nicht, dass das Angebot, für Antworten zu bezahlen, in diesem Forum akzeptabel ist. Es ist sicherlich nicht im Sinne der Seite.) –

+0

@James_D hinzugefügt: Die Tabelle wird immer 3 Spalten haben, zuerst die gameID, zweitens den Spiel speichern Dateinamen und drittens eine Sammlung von Namen von den Menschen im Spiel –

+0

haben Sie dies [post] (http://stackoverflow.com/questions/17316328/default-table-model-in-javafx) angenommen Sie können eine bessere Lösung von diesem Beitrag finden. –

Antwort

1

JavaFX TableView s basieren auf einem Modell, in dem jede Zeile durch ein Objekt repräsentiert wird. Jede Spalte hat eine zugeordnete Funktion (cellValueFactory), die das Objekt für eine Zeile dem Wert zuordnet, der in der entsprechenden Zelle in dieser Spalte angezeigt werden soll.

Also sollten Sie beginnen, indem Sie eine Klasse definieren, die das Element in jeder Zeile darstellt. Verwenden Sie am besten JavaFX properties pattern, damit die Tabelle problemlos an die Daten in den Instanzen dieser Klasse gebunden werden kann.

public class Game { 

    // maybe an IntegerProperty? 
    private final StringProperty id = new SimpleStringProperty(); 
    private final StringProperty saveFileName = new SimpleStringProperty(); 
    private final ListProperty<String> playerNames = new SimpleListProperty<>(FXCollections.observableArrayList()); 

    public Game(String id, String saveFileName, String... playerNames) { 
     setId(id); 
     setSaveFileName(saveFileName); 
     playerNames.get().setAll(playerNames); 
    } 

    public StringProperty idProperty() { 
     return id ; 
    } 

    public final String getId() { 
     return idProperty().get(); 
    } 

    public final void setId(String id) { 
     idProperty().set(id); 
    } 

    // similarly for saveFileName... 

    public ListProperty<String> playerNamesProperty() { 
     return playerNames ; 
    } 

    public final ObservableList<String> getPlayerNames() { 
     return playerNamesProperty().get(); 
    } 

    public final void setPlayerNames(ObservableList<String> playerNames) { 
     playerNamesProperty().set(playerNames); 
    } 
} 

Ihre Daten Accessormethode sollte nun wie folgt aussehen:

public ObservableList<Game> buildTableModel() { 

    try (Connection conn = DriverManager.getConnection(MapperConfig.JDBC_URL)) { 
     PreparedStatement queryOpgeslagenGames = conn.prepareStatement(""); 
     ResultSet rs = queryOpgeslagenGames.executeQuery("SELECT spellen.spelID, spellen.spelNaam AS 'Naam van Spel', group_concat(naam separator ', ') AS 'Deelnemende spelers' FROM spellen RIGHT JOIN spelers ON spellen.spelID =  spelers.spelID GROUP BY spellen.spelID"); 
     // data of the table 
     ObservableList<Game> games = FXCollections.observableArrayList(); 
     while (rs.next()) { 
      String id = rs.get(1); 
      String saveFileName = rs.get(2); 
      String[] playerNames = rs.get(3).split(", "); 
      Game game = new Game(id, saveFileName, playerNames); 
      games.add(game); 
     } 
     return games ; 
    } catch (SQLException ex) { 
     for (Throwable t : ex) { 
      t.printStackTrace(); 
     } 
    } 
    return FXCollections.observableArrayList(); 
} 

Und schließlich Sie die Tabelle mit

TableView<Game> table = new TableView<>(); 
TableColumn<Game, String> idColumn = new TableColumn<>("ID"); 
idColumn.setCellValueFactory(cellData -> cellData.getValue().idProperty()); 
TableColumn<Game, String> saveFileNameColumn = new TableColumn<>("Save file name"); 
saveFileNameColumn.setCellValueFactory(cellData -> cellData.getValue().saveFileNameProperty()); 
TableColumn<Game, ObservableList<String>> playerNamesColumn = new TableColumn<>("Player names"); 
playerNamesColumn.setCellValueFactory(cellData -> callData.getValue().playerNamesProperty()); 

table.setItems(buildTableModel()); 

table.getColumns().addAll(idColumn, saveFileNameColumn, playerNamesColumn); 

Sie können zusätzlich die Wiedergabe in der Spielernamen Spalte verbessern eingerichtet mit etwas wie

playerNamesColumn.setCellFactory(col -> new TableCell<Game, ObservableList<String>>() { 
    @Override 
    protected void updateItem(ObservableList<String> playerNames, boolean empty) { 
     super.updateItem(playerNames, empty); 
     if (empty) { 
      setText(null); 
     } else { 
      setText(String.join(", ", playerNames)); 
     } 
    } 
}); 

oder für eine anspruchsvollere Display:

playerNamesColumn.setCellFactory(col -> new TableCell<Game, ObservableList<String>>() { 

    private final ListView<String> listView = new ListView<>(); 

    @Override 
    protected void updateItem(ObservableList<String> playerNames, boolean empty) { 
     super.updateItem(playerNames, empty); 
     if (empty) { 
      setGraphic(null); 
     } else { 
      listView.setItems(playerNames); 
      setGraphic(listView); 
     } 
    } 
}); 
+0

Sie sind der Held, den jeder Schüler braucht, aber keiner verdient, musste ziemlich viel bearbeiten, damit es funktioniert, wie ich wollte, aber Es funktioniert schließlich wie ein Charme in einer Javafx Stackpane! Rock auf Kumpel! –

Verwandte Themen