У меня есть 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.
Мои колонки:
@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].
Вопрос в том, могу ли я сделать это такими же простыми методами, как и с другими значениями? А если нет, как я могу это сделать по-другому?
@Sedrick Я не совсем понимаю, как этот вопрос связан с моим. Если вы думаете, что это та же проблема, не могли бы вы объяснить мне ее в контексте моего вопроса?
Ты прав. Извините за неправильный ответ.
Просто создайте фабрику самостоятельно. Вы можете создать вспомогательный метод, чтобы избежать повторения кода:
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. У меня были некоторые сомнения по этому поводу.
конечно возможно, но: если отдельные элементы массива имеют какое-то значение, они должны быть смоделированы в адаптере для журнала, а не специально в служебном методе
@kleopatra, можешь мне объяснить, что ты имел в виду под этим адаптером? Я новичок в Java.
Возможный дубликат Вставка данных в JavaFX TableView без промежуточного класса