Как заполнить Столбец Столбца значениями из массива - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть 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;

В моей программе я заполняю столбцы TableView значениями из этого ObservableList. enter image description here

Мои столбцы:

@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) должен быть заполнен счетамиByB [0],

CS (B2) - с оценкамиByB [1],

CS (A1) - с оценкамиByA [0],

CS (A2) - с оценкамиByA [1].

Вопрос в том - могу ли я сделать это теми же простыми методами, которые я делал с другими значениями? И если нет, как я могу это сделать другими способами?

1 Ответ

0 голосов
/ 09 сентября 2018

Просто внедрите завод самостоятельно. Вы можете создать вспомогательный метод, чтобы избежать повторения кода:

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>. (Фактически вы должны изменить все типы значений для столбцов, поскольку ни одно свойство не имеет типа String; все свойства имеют тип Double или Integer .)

...