2017-05-11 14 views
-1

試用の時間と時間がたっても、プロジェクトの締め切りに近づいていて、やや簡単な問題の解決策がまだありません。私はSQLクエリからのデータをテーブルビューを入力する必要がありますが、私はそれは私がオンラインの例をコピー&ペーストしても動作させることはできません...私は、次のコードDefaultTableModelからTable Viewに変換するのに助けが必要です。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(); 
    } 

と同じ結果を必要とするが、私は必要があるので、 JavaFXで使用するにはJtableを使用できず、テーブルビューを使用する必要があります。誰かが私のためにコードを変換できますか? DefaultTableModelを使用してテーブルビューを作成する方法を教えてください。

テーブルには常に3つの列があり、最初にgameID、2番目にゲーム保存ファイル名、3番目にゲーム内の人々の名前のコレクションがあります。

+1

は、それが見えます。あれは正しいですか?もしそうなら、明示的にその情報を質問に含めることができますか? –

+0

@James_Dが追加されました:テーブルには常に3つの列があり、最初にgameIDが表示されます。これは、ゲームのファイル名とセカンドゲームの人々からの名前のコレクションを保存します。 –

+0

あなたはこの[post](http://stackoverflow.com/questions/17316328/default-table-model-in-javafx)を思い出しましたか?このポストからより良い解決策を見つけることができます。 –

答えて

1

JavaFX TableViewは、各行がオブジェクトで表されるモデルに基づいています。各列には、行のオブジェクトをその列の対応するセルに表示される値にマップする関連する機能(cellValueFactory)があります。

まず、各行の項目を表すクラスを定義します。 JavaFX properties patternを使用すると、このクラスのインスタンス内のデータにテーブルを簡単にバインドすることができます。

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); 
    } 
} 

今すぐあなたのデータアクセサメソッドは、次のようになります。

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(); 
} 

そして最後に、あなたが

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); 

でテーブルを設定あなたはさらに持つプレイヤー名欄にレンダリングを向上させることができます〜のようなもの

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)); 
     } 
    } 
}); 
より洗練された表示用

または、:あなたはあなたが必要があるとしているどのように多くの列を知っている、そしてそれらの列のデータが何を表すのようなSQL文から

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

あなたはすべての生徒に必要なヒーローですが、それにふさわしくない人は、私が望むように動作するようにかなり編集しなければなりませんでした。それは最終的にjavafxスタックペインの魅力のように動作します!おいおいでロック! –

関連する問題