如何在 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);
我有一个 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);