首页 > 解决方案 > 如何用数组中的值填充 TableView 的列

问题描述

我有一个ObservableList类的实例GameLogEntry

public class GameLogEntry {
    private int gameNumber;

    private int chosenStratA;
    private int chosenStratB;

    private Double[] scoresByB;
    private Double[] scoresByA;

    private double higherPrice;
    private double lowerPrice;
    private double averagePrice;

    private int maxIndex;

在我的程序中,我使用来自这个 ObservableList 的值填充 TableView 的列。 在此处输入图像描述

我的专栏:

@FXML
    private TableColumn<GameLogEntry, String> colGameNum;

    @FXML
    private TableColumn<GameLogEntry, String> colChosenStratA;

    @FXML
    private TableColumn<GameLogEntry, String> colScoreByBOne;

    @FXML
    private TableColumn<GameLogEntry, String> colScoreByBTwo;

    @FXML
    private TableColumn<GameLogEntry, String> colChosenStratB;

    @FXML
    private TableColumn<GameLogEntry, String> colScoreByAOne;

    @FXML
    private TableColumn<GameLogEntry, String> colScoreByATwo;

    @FXML
    private TableColumn<GameLogEntry, String> colLowerPrice;

    @FXML
    private TableColumn<GameLogEntry, String> colHigherPrice;

    @FXML
    private TableColumn<GameLogEntry, String> colAveragePrice;

我在方法中这样做initialize

colGameNum.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("gameNumber"));
colChosenStratA.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("chosenStratA"));
colChosenStratB.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("chosenStratB"));
colHigherPrice.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("higherPrice"));
colLowerPrice.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("lowerPrice"));
colAveragePrice.setCellValueFactory(new PropertyValueFactory<GameLogEntry, String>("averagePrice"));

但我还需要填写 CS(B1)、CS(B2)、CS(A1) 和 CS(A2) 列。

CS(B1) 应填写 scoreByB[0],

CS(B2) - 使用 scoreByB[1],

CS(A1) - 使用 scoreByA[0],

CS(A2) - 使用 scoreByA[1]。

问题是 - 我可以像使用其他值一样使用相同的简单方法吗?如果没有,我该如何以其他方式做到这一点?

标签: javajavafxtableview

解决方案


只需自己实现工厂。您可以创建一个辅助方法以避免重复代码:

static <S, T> Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> createArrayValueFactory(Function<S, T[]> arrayExtractor, final int index) {
    if (index < 0) {
        return cd -> null;
    }
    return cd -> {
        T[] array = arrayExtractor.apply(cd.getValue());
        return array == null || array.length <= index ? null : new SimpleObjectProperty<>(array[index]);
    };
}
colScoreByBOne.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByB, 0));
colScoreByBTwo.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByB, 1));
colScoreByAOne.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByA, 0));
colScoreByATwo.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByA, 1));

但是,要使其正常工作,您需要将列的类型更改为TableColumn<GameLogEntry, Double>. (事实上​​,您应该更改列的所有值类型,因为没有一个属性是 type String;所有属性都是 typeDoubleInteger。)


推荐阅读