【问题标题】:Set items column by column in TableView JavaFX在 TableView JavaFX 中逐列设置项目
【发布时间】:2018-03-08 13:19:36
【问题描述】:

我有一个小问题;

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

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

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

请,任何帮助将不胜感激

【问题讨论】:

  • 那么你想把两个 ObservableList 添加到同一个 TableView 中?
  • 是的,就是这样,因为我有 2 个来自不同对象的 ObservableList,我想分别放置 1 列
  • 没有办法像@FXML private TableView peopleTable;或 myColumnPeople1.setItems(mylist) ?

标签: java javafx tableview javafx-8


【解决方案1】:

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

  1. 创建一个抽象类型,它可以是抽象类或接口(例如:Person),应该由Person1和Person2类继承。
  2. 只创建一个 ObservableList of Persons,其中包含 people1List 和 people2List。
  3. 当你想在 TableView 中设置值时,你应该使用instaceof 来检查一个人是instaceof Person1 还是instanceof Person2,现在你可以在第一列或第二列中设置这个人。

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    但是,您可以使用 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);
    

    【讨论】:

    • 为什么 TableView 是 Integer Tableview ?
    • @sleakerz 因为每一行的值都是列表的索引。
    【解决方案3】:

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

    或者当您真的无法更改两个 People 类时。您可以为每个人员类创建一个具有两个构造函数的类,并在 ListView 中表示这些对象的列表,例如:

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

    并在您的 ListView 中显示peopleList

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2017-04-30
      相关资源
      最近更新 更多