在 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

请提供任何帮助,我们将不胜感激

将两个可观察列表显示到同一个表视图中的一种解决方案如下:

  1. 创建一个抽象类型,它可以是抽象的class或接口(例如:Person),应该被Person1和Person2继承class。
  2. 仅创建一个 ObservableList of Persons,其中包含 people1List 和 people2List。
  3. 当你想在 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

您不能为每一列设置不同的项目。

但是您可以使用 cellValueFactorys 从列表中提取值:

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