Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何填充TableView';使用数组中的值替换列_Java_Javafx_Tableview - Fatal编程技术网

Java 如何填充TableView';使用数组中的值替换列

Java 如何填充TableView';使用数组中的值替换列,java,javafx,tableview,Java,Javafx,Tableview,我有一个类GameLogEntry实例的ObservableList: public class GameLogEntry { private int gameNumber; private int chosenStratA; private int chosenStratB; private Double[] scoresByB; private Double[] scoresByA; private double higherPrice;

我有一个类
GameLogEntry
实例的
ObservableList

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;
但我还需要填写CS(B1)、CS(B2)、CS(A1)和CS(A2)列

CS(B1)应填写ScoresBy[0]

CS(B2)-带scoresByB[1]

CS(A1)-分数为[0]

CS(A2)-带scoresByA[1]


问题是——我能像对待其他值一样,用同样简单的方法来做吗?如果没有,我怎么能用其他方法来实现呢?

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

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

但是,要使其工作,您需要将列的类型更改为
TableColumn
。(事实上,您应该更改列的所有值类型,因为没有一个属性的类型是
String
;所有属性的类型都是
Double
Integer

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

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

但是,要使其工作,您需要将列的类型更改为
TableColumn
。(事实上,您应该更改列的所有值类型,因为没有一个属性的类型是
String
;所有属性的类型都是
Double
Integer

可能重复的@Sedrick我真的不明白这个问题与我的相关。如果你认为这是关于同一个问题,请你在我的问题中向我解释一下好吗?你是对的。对不起,答错了。这更接近于你问的@Sedrick的可能副本我真的不明白这个问题和我的有什么关系。如果你认为这是关于同一个问题,请你在我的问题中向我解释一下好吗?你是对的。对不起,答错了。这更接近你要问的内容谢谢你指出字符串类型是错误的。我对此有些怀疑。当然有可能,但是:如果数组中的各个元素具有某种意义,那么它们应该在日志适配器中建模,而不是在实用程序中特别建模method@kleopatra你能解释一下你说的适配器是什么意思吗?我是Java新手。感谢您指出字符串类型是错误的。我对此有些怀疑。当然有可能,但是:如果数组中的各个元素具有某种意义,那么它们应该在日志适配器中建模,而不是在实用程序中特别建模method@kleopatra你能解释一下你说的适配器是什么意思吗?我对Java很陌生。
colScoreByBOne.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByB, 0));
colScoreByBTwo.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByB, 1));
colScoreByAOne.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByA, 0));
colScoreByATwo.setCellValueFactory(createArrayValueFactory(GameLogEntry::getScoresByA, 1));