JavaFX - 自定义ListView外观

时间:2016-03-21 01:17:52

标签: listview javafx customization

我使用listview作为排行榜,并显示由字符串完成的玩家姓名和总分。但我想自定义列表视图,因此它包括位置和平均分数。我在下面提供了一个关于我希望它如何的草图。

Sketch

现在,我将一个普通字符串添加到Observable列表并在列表视图中查看它,但无法自定义它。我不确定如何实际做到这一点,最好的方法是什么?使用css还是javafx?我对listview有一些问题,例如是否可以有一个静态标题,例如tableview?

  

更新

我试图创建一个自定义的HBox单元并尝试使用它,但似乎我做错了。我尝试使用gridpane来调整文本位置。但Listview看起来像这样。

我已经加入了两名球员(Jonny获得59分,Mike获得15分) enter image description here

我见过人们使用listcell (Link)代替Hbox的例子,但我选择这种方式的原因是因为我想传递playerName,totalScore&按totalScore对我的playerStats数组进行排序后的平均值。因此列表视图可以按其总计的升序显示玩家。如果有更好的方法,请分享。

控制器类

全球字段:

ListView<CustomCellHBox> leaderBoard = new ListView<CustomCellHBox>();
ObservableList<CustomCellHBox> rank = FXCollections.observableArrayList();

UpdateListView()方法:

    public void updateListView() {
        rank.clear();

        List<CustomCellHBox> data = new ArrayList<CustomCellHBox>();

        for(Statistics s : playerStats){
            data.add(new CustomCellHBox(s.getPlayer(),s.getTotalScore(),s.getAverage()));
        }

        rank = FXCollections.observableArrayList(data);
        leaderBoard.setItems(rank);
}

CustomCellHBox类

    public class CustomCellHBox extends HBox {


    private Label playerName = new Label();
    private Label totalScore = new Label();
    private Label averageScore = new Label();
    private GridPane grid = new GridPane();

    CustomCellHBox(String playerName, int totalScore, double averageScore) {
        super();

        this.playerName.setText(playerName);
        this.totalScore.setText(String.valueOf(totalScore));
        this.averageScore.setText(String.valueOf(averageScore));

        grid.setHgap(10);
        grid.setVgap(4);
        this.playerName.setMaxWidth(Double.MAX_VALUE);
        this.averageScore.setMaxWidth(Double.MAX_VALUE);
        this.totalScore.setMaxWidth(Double.MAX_VALUE);


        grid.add(this.playerName,0,0);
        grid.add(this.totalScore,0,1);
        grid.add(this.averageScore,0,2);
        this.setHgrow(grid,Priority.ALWAYS);

        this.getChildren().addAll(grid);
    }


}

使用时listcell工作正常。但它不是我想要的。

  grid.add(this.playerName,0,0);
        grid.add(this.totalScore,1,0);
        grid.add(this.averageScore,2,0);

结果:

enter image description here

1 个答案:

答案 0 :(得分:-1)

也许controlFX的SpreadSheetView是一种很好的方法:http://fxexperience.com/controlsfx/features/#spreadsheetview