0

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

添加玩家

玩家添加到列后

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

如果添加了 3 个玩家,有没有办法在 score 类中创建 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);
4

1 回答 1

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的 s 添加到表的项目列表中,它们将默认为每个玩家的分数为零。您可以设置分数

game.getScores().put(player, score);

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

于 2016-01-27T22:10:52.350 回答