java - 如何用数组中的值填充 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]。
问题是 - 我可以像使用其他值一样使用相同的简单方法吗?如果没有,我该如何以其他方式做到这一点?
解决方案
只需自己实现工厂。您可以创建一个辅助方法以避免重复代码:
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
;所有属性都是 typeDouble
或Integer
。)
推荐阅读
- click - 单击绝对位置而不是后面的元素
- spring-boot - 在 SpringBoot 中为验证提供默认值
- javascript - 无法保存 App.js 以查看所做的更改
- python - 删除和添加值到 numpy 数组
- c# - HttpClient.SendAsync 抛出“任务被取消”问题
- python - 创建了一些对象的约会槽
- vue.js - FullCalendar 和 Vuejs 的显示加载指示器
- css - Struts 2- 为选择标签中的每个选项应用 css 样式
- flutter - 如何全局忽略最大线长的 IntelliJ 注释器(颤振)
- android - GoogleSignInClient 在物理设备上始终返回 null