在 TableView JavaFX 中逐列设置项目
Set items column by column in TableView JavaFX
我有一个小问题;
我目前有 2 个无法更改的来自不同对象的列表;
private ObservableList<People1> people1List = FXCollections.observableArrayList();
private ObservableList<People2> people2List = FXCollections.observableArrayList();
当我尝试在 table 中添加数据时,每列中只有第二个值:
people2List = FXCollections.observableArrayList(people1.getObservable().values());
peopleTable.setItems(people2List.sorted(new DataValueComparator()));
people1List = FXCollections.observableArrayList(peopl2.getObservable().values());
peopleTable.setItems(people1List.sorted(new DataValueComparator()));
我如何在专栏上做 "setItems()"?然后在列中有 2 个不同的可观察对象?
我知道如果我执行两次 setItems,它会覆盖第一个,但是列上有方法 setItems
请提供任何帮助,我们将不胜感激
将两个可观察列表显示到同一个表视图中的一种解决方案如下:
- 创建一个抽象类型,它可以是抽象的class或接口(例如:Person),应该被Person1和Person2继承class。
- 仅创建一个 ObservableList of Persons,其中包含 people1List 和 people2List。
- 当你想在 TableView 中设置值时,你应该使用
instaceof
来检查一个人是 instaceof Person1
还是 instanceof Person2
现在你可以在第一个中设置这个人或第二列。
希望对您有所帮助。
不,您不能在 ListView 中显示两个不同的列表。
您可以使用 Dina 描述的界面来解决您的问题。
或者当你真的无法改变两个人的时候classes。您可以为每个人 Class 创建一个带有两个构造函数的 class 并在您的 ListView 中表示这些对象的列表,例如:
public class People{
//some variable
public People(People1 p1){
}
public People(People2 p2){
}
}
private ObservableList<People> peopleList = FXCollections.observableArrayList();
并在您的 ListView 中显示 peopleList
。
您不能为每一列设置不同的项目。
但是您可以使用 cellValueFactory
s 从列表中提取值:
final ObservableList<People1> source1 = people1List.sorted(new DataValueComparator());
final ObservableList<People2> source2 = people2List.sorted(new DataValueComparator());
TableView<Integer> tableView = new TableView<>();
InvalidationListener listener = o -> {
// keep items size the max of list sizes
int newSize = Math.max(source1.size(), source2.size());
if (tableView.getItems().size() > newSize) {
tableView.getItems().subList(newSize, tableView.getItems().size()).clear();
} else {
for (int i = tableView.getItems().size(); i < newSize; i++) {
tableView.getItems().add(i);
}
}
};
source1.addListener(listener);
source2.addListener(listener);
TableColumn<Integer, People1> column1 = ...
column1.setCellValueFactory(cd -> Bindings.valueAt(source1, cd.getValue()));
TableColumn<Integer, People2> column2 = ...
column2.setCellValueFactory(cd -> Bindings.valueAt(source2, cd.getValue()));
tableView.getColumns().addAll(column1, column2);
我有一个小问题;
我目前有 2 个无法更改的来自不同对象的列表;
private ObservableList<People1> people1List = FXCollections.observableArrayList();
private ObservableList<People2> people2List = FXCollections.observableArrayList();
当我尝试在 table 中添加数据时,每列中只有第二个值:
people2List = FXCollections.observableArrayList(people1.getObservable().values());
peopleTable.setItems(people2List.sorted(new DataValueComparator()));
people1List = FXCollections.observableArrayList(peopl2.getObservable().values());
peopleTable.setItems(people1List.sorted(new DataValueComparator()));
我如何在专栏上做 "setItems()"?然后在列中有 2 个不同的可观察对象?
我知道如果我执行两次 setItems,它会覆盖第一个,但是列上有方法 setItems
请提供任何帮助,我们将不胜感激
将两个可观察列表显示到同一个表视图中的一种解决方案如下:
- 创建一个抽象类型,它可以是抽象的class或接口(例如:Person),应该被Person1和Person2继承class。
- 仅创建一个 ObservableList of Persons,其中包含 people1List 和 people2List。
- 当你想在 TableView 中设置值时,你应该使用
instaceof
来检查一个人是instaceof Person1
还是instanceof Person2
现在你可以在第一个中设置这个人或第二列。
希望对您有所帮助。
不,您不能在 ListView 中显示两个不同的列表。 您可以使用 Dina 描述的界面来解决您的问题。
或者当你真的无法改变两个人的时候classes。您可以为每个人 Class 创建一个带有两个构造函数的 class 并在您的 ListView 中表示这些对象的列表,例如:
public class People{
//some variable
public People(People1 p1){
}
public People(People2 p2){
}
}
private ObservableList<People> peopleList = FXCollections.observableArrayList();
并在您的 ListView 中显示 peopleList
。
您不能为每一列设置不同的项目。
但是您可以使用 cellValueFactory
s 从列表中提取值:
final ObservableList<People1> source1 = people1List.sorted(new DataValueComparator());
final ObservableList<People2> source2 = people2List.sorted(new DataValueComparator());
TableView<Integer> tableView = new TableView<>();
InvalidationListener listener = o -> {
// keep items size the max of list sizes
int newSize = Math.max(source1.size(), source2.size());
if (tableView.getItems().size() > newSize) {
tableView.getItems().subList(newSize, tableView.getItems().size()).clear();
} else {
for (int i = tableView.getItems().size(); i < newSize; i++) {
tableView.getItems().add(i);
}
}
};
source1.addListener(listener);
source2.addListener(listener);
TableColumn<Integer, People1> column1 = ...
column1.setCellValueFactory(cd -> Bindings.valueAt(source1, cd.getValue()));
TableColumn<Integer, People2> column2 = ...
column2.setCellValueFactory(cd -> Bindings.valueAt(source2, cd.getValue()));
tableView.getColumns().addAll(column1, column2);