创建自定义列后创建行

时间:2016-01-27 21:19:30

标签: javafx tableview multiple-columns rows observablelist

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

Adding Players

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

1 个答案:

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

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