创建自定义列后创建行

Creating rows after creating custom columns

我正在使用 javafx 创建记分板。
我的程序有一个 table,其中有一列是游戏 ID。当您按下新游戏时,您最多可以添加 10 名玩家。输入球员姓名并按下按钮将球员添加到 table 列。我在下面提供了图片,以便您更清楚地了解。

Adding Players

After players added to columns

这是我卡住的地方。我需要在行中添加每场比赛的分数。由于我根据玩家数量生成自定义列数 (2-10)。我无法使用此代码,因为我不知道 Score Class.

中的分数构造函数需要多少参数

如果添加了 3 个玩家,有没有办法在分数 class 中创建 3 个 int 参数?或者我可以用不同的方式来处理这个问题吗?另一种选择可能是在下面添加随机数,然后将行动态编辑为真实分数,但程序又不知道有多少列,所以这也很难。

public ObservableList<Score> getScore() {
        ObservableList<Score> scores= FXCollections.observableArrayList();
        scores.add(new Score(10,12,13,11,15,90));
        scores.add(new Score(100,10,29,29));
        return scores;
    } 

我认为它的外观示例:

Game Nr:|Bill Gates | Steve Jobs |
   1    |    80     |    10      |
   2    |    6      |    75      |

PS: 有没有办法对列求和并显示总分。我希望总和位于最后一行,所以即使我添加一个带有分数的新行,总和也会出现在该行下方。

用于将玩家从文本字段添加到列的代码:

        TableColumn<Player, String> p1 = new TableColumn<>(player1.getText());
        TableColumn<Player, String> p2 = new TableColumn<>(player2.getText());
        TableColumn<Player, String> p3 = new TableColumn<>(player3.getText());
        table.getColumns().addAll(p1, p2, p3);

您可以创建一个游戏 class,它有一个游戏编号(固定的)并将分数表示为从玩家到值的映射:

public class Game {
    private final int gameNumber ;
    private final ObservableMap<String, Integer> scores 
        = FXCollections.observableHashMap();

    public Game(int gameNumber) {
        this.gameNumber = gameNumber ;
    }

    public ObservableMap<String, Integer> getScores() {
        return scores ;
    }

    public int getGameNumber() {
        return gameNumber ;
    }
}

如果我没理解错的话,当用户输入新玩家时,你想重置table,你可以用下面的方法来做:

private TableView<Game> scoreTable ;

// ...

private void resetTable(List<String> players) {
    scoreTable.getColumns().clear();
    scoreTable.getItems().clear();

    TableColumn<Game, Integer> gameNumCol = new TableColumn<>("Game");
    gameNumCol.setCellValueFactory(cellData -> new ObservableValueBase<Integer>() {
        @Override
        public Integer getValue() {
            return cellData.getValue().getGameNumber();
        }
    });
    scoreTable.getColumns().add(gameNumCol);

    for (String player : players) {
        TableColumn<Game, Integer> col = new TableColumn<>(player);
        col.setCellValueFactory(cellData -> {
            Game game = cellData.getValue();
            IntegerBinding score = Bindings.createIntegerBinding(() ->
               game.getScores().getOrDefault(player, 0),
               game.getScores());
            return score.asObject() ;
        });
        // if you need editing:
        col.setOnEditCommit(e -> {
            Game game = e.getRowValue();
            Integer newScore = e.getNewValue();
            game.getScores().put(player, newScore);
        });
        scoreTable.getColumns().add(col);
    }
}

然后您只需将新的 Game 添加到 table 的项目列表中,它们将默认为每个玩家的零分。您可以使用

设置分数
game.getScores().put(player, score);

SSCCE 在 https://gist.github.com/james-d/aa51204a2e7ed16d75b7