创建自定义列后创建行
Creating rows after creating custom columns
我正在使用 javafx 创建记分板。
我的程序有一个 table,其中有一列是游戏 ID。当您按下新游戏时,您最多可以添加 10 名玩家。输入球员姓名并按下按钮将球员添加到 table 列。我在下面提供了图片,以便您更清楚地了解。
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
我正在使用 javafx 创建记分板。
我的程序有一个 table,其中有一列是游戏 ID。当您按下新游戏时,您最多可以添加 10 名玩家。输入球员姓名并按下按钮将球员添加到 table 列。我在下面提供了图片,以便您更清楚地了解。
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