代码之家  ›  专栏  ›  技术社区  ›  sleakerz

在TableView JavaFX中逐列设置项

  •  1
  • sleakerz  · 技术社区  · 7 年前

    我有一个小问题;

    我目前有两个不同对象的列表,我无法更改;

    private ObservableList<People1> people1List = FXCollections.observableArrayList();
    
    private ObservableList<People2> people2List = FXCollections.observableArrayList();
    

    当我尝试在表中添加数据时,每列中只有第二个值:

    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()”?然后在列中有两个不同的可观测对象?

    我知道如果我做两次setItems,它会覆盖第一次,但列上有方法setItems

    请,如果有任何帮助,我们将不胜感激

    3 回复  |  直到 7 年前
        1
  •  2
  •   Dina Bogdan    7 年前

    在同一个tableview中显示两个可观察列表的一种解决方案如下:

    1. 创建一个抽象类型,它可以是应该由Person1和Person2类继承的抽象类或接口(例如:Person)。
    2. 只创建一个包含people1List和people2List的ObservableList。
    3. 要在TableView中设置值时,应使用 instaceof 用于检查某人是否 instaceof Person1 instanceof Person2 现在您可以在第一列或第二列中设置人员。

    我希望这对你有帮助。

        2
  •  2
  •   fabian    7 年前

    不能为每列设置不同的项。

    但是,您可以使用 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);
    
        3
  •  1
  •   Morchul drojokef    7 年前

    不,不能在ListView中显示两个不同的列表。 您可以使用Dina描述的接口来解决问题。

    或者当你真的无法改变两个人的阶级时。您可以为每个People类创建一个包含两个构造函数的类,并在ListView中表示这些对象的列表,如:

    public class People{
            //some variable
            public People(People1 p1){
            }
    
            public People(People2 p2){
            }
        }
    
        private ObservableList<People> peopleList = FXCollections.observableArrayList();
    

    并显示 peopleList 在ListView中。