gpt4 book ai didi

java - TableColumn #setCellValueFactory 对于具有 HashMap 的类

转载 作者:行者123 更新时间:2023-12-01 19:36:26 26 4
gpt4 key购买 nike

我有一个自定义类 BasicDataSet其中包含 HashMap需要渲染(和可更新)到 JavaFX TableView 。一个BasicDataSet对象表示一行,该列缺少的任何 HashMap 值都将在表中呈现为空字符串。

一个BasicDataSet包含 dataPoints、name 和 tagName 的 HashMap 。当 ArrayList<BasicDataSet>传递到该方法中,每个 HashMap 对象中的所有键都会被拉出,并过滤重复项。这些键将成为列标题值,并用于从 HashMap 中提取数据(在工厂中)。

我的问题是创建一个执行此操作的单元格值工厂。此方法假设创建一个 TableView我的 View Controller 的对象。

    public static TableView<BasicDataSet> renderTableFromBasicDataSets(ArrayList<BasicDataSet> sets) {

TableView<BasicDataSet> tableView = new TableView<>();

// create all keys required for the collection of basic data sets
// and remove duplicates using a stream
ArrayList<String> keys = new ArrayList<>();
keys.add("name");
keys.add("tagName");
for(BasicDataSet basicDataSet : sets) {
keys.addAll(basicDataSet.getDataPointKeys());
}
keys = new ArrayList<>(keys.stream().distinct().collect(Collectors.toList()));

// create all required columns using keys to label column names
// then declare their cellValueFactories
for(String columnHeader : keys) {
TableColumn<BasicDataSet, String> tempColumn = new TableColumn<>(columnHeader);
tempColumn.setCellValueFactory(data -> {
for(BasicDataSet set : sets) {
if(columnHeader.equals("name")) {
return new ReadOnlyStringWrapper(set.getName());
} else if(columnHeader.equals("tagName")) {
return new ReadOnlyStringWrapper(set.getTagName());
} else {
final String tempVal = set.getDataPoint(columnHeader);
if(tempVal != null) {
return new ReadOnlyStringWrapper(set.getDataPoint(columnHeader));
} else {
return new ReadOnlyStringWrapper("");
}
}
}
return new ReadOnlyStringWrapper("");
});
tableView.getColumns().add(tempColumn);
}

return tableView;
}

当此代码运行时,仅呈现带有标题的列。没有显示任何数据。

我是 Lambda 函数的新手,因此我们将不胜感激有关工厂的任何额外详细信息!

编辑:Here您将在 GitHub 上找到一个小示例项目。

最佳答案

您的单元值工厂需要利用其 data争论。该参数是 TableColumn 请求值的实际行数据。

忽略sets 。您不应查看所有数据,而应仅查看 data 表示的单行数据。 .

这意味着您的代码可以简单地删除 for (BasicDataSet set : sets)循环,可以得到set来自data.getValue() :

tempColumn.setCellValueFactory(data -> {
BasicDataSet set = data.getValue();
if (columnHeader.equals("name")) {
return new ReadOnlyStringWrapper(set.getName());
} else if (columnHeader.equals("tagName")) {
return new ReadOnlyStringWrapper(set.getTagName());
} else {
final String tempVal = set.getDataPoint(columnHeader);
if(tempVal != null) {
return new ReadOnlyStringWrapper(set.getDataPoint(columnHeader));
} else {
return new ReadOnlyStringWrapper("");
}
}
});

理想情况下,您应该设计 BasicDataSet 类,以便它将其数据作为属性或其他可观察值提供,这样您的单元格值工厂就不必不断创建临时的“无实体”属性:

public class BasicDataSet {
private final ReadOnlyStringWrapper name = new ReadOnlyStringWrapper();
private final ReadOnlyStringWrapper tagName = new ReadOnlyStringWrapper();
private final ObservableMap<String, String> dataPoints =
FXCollections.observableHashMap();

private final ObservableSet<String> keys =
FXCollections.observableSet();

public BasicDataSet(String name,
String tagName) {

this.name.set(name);
this.tagName.set(tagName);

dataPoints.addListener(
(MapChangeListener.Change<? extends String, ? extends String> c) -> {
if (c.wasRemoved()) {
keys.remove(c.getKey());
}
if (c.wasAdded()) {
keys.add(c.getKey());
}
});
}

public ReadOnlyStringProperty nameProperty() {
return name.getReadOnlyProperty();
}

public String getName() {
return name.get();
}

public ReadOnlyStringProperty tagNameProperty() {
return tagName.getReadOnlyProperty();
}

public String getTagName() {
return tagName.get();
}

public ObservableMap<String> getObservableDataPoints() {
return dataPoints;
}

public ObservableSet<String> getDataPointKeys() {
return keys;
}

public StringBinding getObservableDataPoint(String key) {
return Bindings.stringValueAt(dataPoints, key);
}

public String getDataPoint(String key) {
return getObservableDataPoint(key).get();
}
}

这允许您将属性直接传递到单元值工厂:

tempColumn.setCellValueFactory(data -> {
BasicDataSet set = data.getValue();
if (columnHeader.equals("name")) {
return set.nameProperty();
} else if (columnHeader.equals("tagName")) {
return set.tagNameProperty();
} else {
return set.getObservableDataPoint(columnHeader);
}
});

关于java - TableColumn #setCellValueFactory 对于具有 HashMap 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com