如何显示在表列列表,列表项几个字段(How to show a list on table colu

2019-10-29 03:45发布

UPDATE:这qustion搬到TableColumn的应仅显示一个复杂的数据类型的一个特定的值 ,因为它更具体

我想填充表与复杂的数据类型Personnameid和一个List<Person> 。 目前,我得到了正确的表nameid和与其他全信息的第三列Person秒,但它应该只显示的姓名Persons秒。 有没有我的第三栏只显示任何方式Person.getName()值?

关键词,解决方案的欢迎! 非常感谢你!

编辑:代码

Person.class

public class Person {
    String id;
    String name;
    List<Person> friends;

public String getId() {...}
public String getName() {....}
public List<Person> getFriends {...}
}

TableView.class

public TableView<Person> createTable() {
    TableColumn<Person, String> firstCol = new TableColumn<>("ID");
        TableColumn<Person, String> secondCol = new TableColumn<>("Name");
        TableColumn<Person, List<Person> thirdCol = new TableColumn<>("Friends");

        PropertyValueFactory<Person, String> firstColFactory = new PropertyValueFactory<>(
            "id");
        PropertyValueFactory<Person, String> secondColFactory = new PropertyValueFactory<>(
            "name");
        PropertyValueFactory<Person, List<Person>> thirdColFactory = new PropertyValueFactory<>(
            "friends");

    firstCol.setCellValueFactory(firstColFactory);
    secondCol.setCellValueFactory(secondColFactory);
    thirdCol.setCellValueFactory(thirdColFactory);

    myTableView.getColumns().addAll(firstCol, secondCol, thirdCol);
}

所以,如果我填的表格idname -colums包含正确的姓名和第三列(与List<Person> )显示[Person [id1, John, ...]...]] 现在我要问,如果那里有一种可能性,即第三列只显示idname不处理数据?

Answer 1:

作为替代Uluk的解决方案,考虑设置在列的单元格工厂,而不是单元格的值工厂。 这两者之间的选择取决于你如何看待柱与模型之间的关系( Person )。 如果考虑名称的列表是由列显示的数据,然后Uluk的解决方案是要走的路。 如果你考虑名单Person的对象是数据,这是由他们的名字显示出来,那么这将是更直观的选项:

TableColumn<Person, List<Person> thirdCol = new TableColumn<>("Friends");
PropertyValueFactory<Person, List<Person>> thirdColFactory = new PropertyValueFactory<>("friends");
thirdCol.setCellValueFactory(thirdColFactory);

thirdCol.setCellFactory(col -> new TableCell<Person, List<Person>>() {
    @Override
    public void updateItem(List<Person> friends, boolean empty) {
        super.updateItem(friends, empty);
        if (empty) {
            setText(null);
        } else {
            setText(friends.stream().map(Person::getName)
                .collect(Collectors.joining(", ")));
        }
    }
});

这可以很容易地改变被显示在列,如列表的方式:

thirdCol.setCellFactory( col -> {
    ListView<Person> listView = new ListView<>();
    listView.setCellFactory(lv -> new ListCell<Person>() {
        @Override
        public void updateItem(Person person, boolean empty) {
            super.updateItem(person, empty);
            if (empty) {
                setText(null);
            } else {
                setText(person.getName());
            }
        }
    });
    return new TableCell<Person, List<Person>>() {
        @Override
        public void updateItem(List<Person> friends, boolean empty) {
            super.updateItem(friends, empty);
            if (empty) {
                setGraphic(null);
            } else {
                listView.getItems().setAll(friends);
                setGraphic(listView);
            }
        }
    };
});


Answer 2:

您可以定义与你控制哪些字段显示长扩展版本单元格值工厂:

thirdColFactory.setCellValueFactory(
  ( TableColumn.CellDataFeatures<Person, String> p ) ->
{
    List<Person> friends = p.getValue().getFriends();
    String val = friends
                 .stream()
                 .map( item -> item.getName() )
                 .reduce( "", ( acc, item ) -> acc + ", " + item );
    return new ReadOnlyStringWrapper( val );
});


文章来源: How to show a list on table column, with few fields of list items