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