如何在 JavaFX 的表列中显示 ArrayList<String> 的每个元素

How To Show Each Element of a ArrayList<String> in a Tablecolumn in JavaFX

我有一个 TableView<DataModelClass> table,它只有一个 TableColumn name 在我的 DataModelClass 中有一个 ArrayList<String> nameList 可以包含一个或 多个 名字。现在,当我 运行 我的代码时, Name 列看起来像这样,[name1,name2,name3..]但我想显示每个 name1 name2 name3 在单独的一行中。像这样,

-+-----------------+-                       -+-----------------+-
 |       Name      |   << I am Getting       |       Name      |
-+-----------------+-  Instade Like This >> -+-----------------+-      
 | [name1,name2,..]|                         |      name1      |   
-+-----------------+-                        |      name2      |
 |                 |                         |      name3      |
-+-----------------+-                       -+-----------------+-
                                             |                 |
                                            -+-----------------+-

我希望你明白我的想法,但我怎样才能实现它?

数据模型类代码

public class DataModelClass {


    private ArrayList<String>nameList;

    private DataModelClass(ArrayList<String> nameList) {
        this.nameList = nameList;
    }

    public String getNameList() {
        return nameList;
    }

    public void setNameList(ArrayList<String> nameList) {
        this.nameList = nameList;
    }
}

TableVied代码

private TableView<DataModelClass> table = new TableView<DataModelClass>();
TableColumn colName = new TableColumn("Name");
        colName.setMinWidth(80);
        colName.setCellValueFactory(
                new PropertyValueFactory<GroupDataForTable, ArrayList<String> >("nameList"));

private ObservableList<DataModelClass> groupData = FXCollections.observableArrayList();
groupData.add(new DataModelClass(someNonEmptyArrayList));
table.setItems(groupData);

虽然你的设计有点奇怪,但是..

您可以使用流并将列表转换为 String 对象,然后 return 它来自 getter 方法。

nameList.stream().collect(Collectors.joining("\n"));

这将为您提供换行符中的每个元素,但它是一个完整的字符串。

public class DataModelClass {

    private List<String> nameList;

    ...

    public String getNameList() {
        return nameList.stream().collect(Collectors.joining("\n"));
    }

    ...
}

在您使用 TableView 的 class 中,

TableColumn<DataModelClass, String> name = new TableColumn<DataModelClass, String>("Name");
name.setCellValueFactory(new PropertyValueFactory<DataModelClass, String>("nameList"));

您为 TableView 指定的类型是 table 的每一行表示的对象的类型。由于您只有一个 DataModelClass 对象,这不是用于 table 视图的正确类型。

按照你的问题,每一行只包含一个字符串,所以你应该

private TableView<String> table = new TableView<String>();

然后您可以简单地通过

从您的DataModelClass实例中填充项目
DataModelClass data = new DataModelClass(someNonEmptyArrayList);
table.getItems().setAll(data.getNameList());

现在您只需确保该列显示正确的值:

TableColumn colName = new TableColumn("Name");
colName.setMinWidth(80);
colName.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue()));
table.getColumns().add(colName);