Как заполнить столбец 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;

В моей программе я заполняю столбцы TableView значениями из этого 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) должен быть заполнен scoresByB [0],

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

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

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

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

Возможный дубликат Вставка данных в JavaFX TableView без промежуточного класса

Sedrick 09.09.2018 16:49

@Sedrick Я не совсем понимаю, как этот вопрос связан с моим. Если вы думаете, что это та же проблема, не могли бы вы объяснить мне ее в контексте моего вопроса?

kekyc 09.09.2018 17:00

Ты прав. Извините за неправильный ответ.

Sedrick 09.09.2018 17:03
stackoverflow.com/questions/20769723/… это ближе к тому, что вы просите
Sedrick 09.09.2018 17:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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]);
    };
}
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.)

Спасибо, что указали на неправильный тип String. У меня были некоторые сомнения по этому поводу.

kekyc 09.09.2018 19:39

конечно возможно, но: если отдельные элементы массива имеют какое-то значение, они должны быть смоделированы в адаптере для журнала, а не специально в служебном методе

kleopatra 11.09.2018 12:45

@kleopatra, можешь мне объяснить, что ты имел в виду под этим адаптером? Я новичок в Java.

kekyc 12.09.2018 21:51

Другие вопросы по теме