我正在使用javafx创建记分板 我的程序有一个表,其中一列是游戏ID。当您按下新游戏时,您最多可以添加10个玩家。输入玩家名称,然后按按钮将玩家添加到表格列中。我在下面提供了图片,以便您能够更清楚地了解。
After players added to columns
这就是我被困的地方。我需要在每行上添加得分。因为我根据玩家的数量生成了自定义数量(2-10)的列。我无法使用此代码,因为我不知道分数类中得分构造函数需要多少参数。
如果添加了3个玩家,有没有办法在得分类中创建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);
答案 0 :(得分:0)
您可以创建一个游戏类,其中包含一个游戏编号(固定),并将得分表示为从玩家到值的地图:
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 ;
}
}
如果我正确理解了要求,当用户输入新玩家时,您想要重置表格,您可以使用以下方法:
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
添加到表的项目列表中,并且它们将默认为每个玩家的零分数。您可以使用
game.getScores().put(player, score);