在TableView JavaFX中逐列设置项目

时间:2018-03-08 13:19:37

标签: java javafx tableview javafx-8

我有一个小问题;

我目前有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 objets?

我知道如果我执行setItems两次,它将覆盖第一个,但是列上有方法setItems

请,任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

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

  1. 创建一个抽象类型,它可以是抽象类或接口(例如:Person),它应该由Person1和Person2类继承。
  2. 只创建一个包含people1List和people2List的人的ObservableList。
  3. 如果要在TableView中设置值,则应使用instaceof检查Person是instaceof Person1还是instanceof Person2,现在您可以设置第一个人或import numpy as np from skimage.measure import marching_cubes arr1 = np.zeros((4,4,4)) arr2 = np.zeros((4,4,4)) # Perfect match of structure and voxel layout arr1[:,1,:] = 0.5 # Mismatch of structure and voxel layout arr2[:,1:3,:] = 0.25 # Finds the surface v1, s2, n1, val1 = marching_cubes(arr1, level=0.4) # Does not find the surface v2, s2, n2, val2 = marching_cubes(arr2, level=0.4) 第二栏。
  4. 我希望这会对你有所帮助。

答案 1 :(得分:2)

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

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

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 :(得分:1)

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

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

public class People{
        //some variable
        public People(People1 p1){
        }

        public People(People2 p2){
        }
    }

    private ObservableList<People> peopleList = FXCollections.observableArrayList();

并在ListView中显示peopleList