我目前正在尝试使用arraylist填充javafx gui中的tableview,它或多或少都在工作。
这是我的代码:
GUI.xml:
<TableView fx:id="tableBookList">
<columns>
<TableColumn fx:id="columnTitle" text="Title" />
<TableColumn fx:id="columnQuantity" text="Quantity" />
<TableColumn fx:id="columnUUID" text="UUID" />
</columns>
</TableView>
GUIController.java:
public void setTableContent(ArrayList<Book> bookList)
{
columnTitle = new TableColumn<>("columnTitle");
columnQuantity = new TableColumn<>("columnQuantity");
columnUUID = new TableColumn<>("columnUUID");
ObservableList<Book> data = FXCollections.<Book>observableArrayList(new Book("Test", 1));
data.addAll(bookList);
columnTitle.setCellValueFactory(new PropertyValueFactory<Book, String>("title"));
columnQuantity.setCellValueFactory(new PropertyValueFactory<Book, Integer>("quantity"));
columnUUID.setCellValueFactory(new PropertyValueFactory<Book, String>("uuid"));
tableBookList.setItems(data);
// This is working but adding three new columns every time :(
tableBookList.getColumns().addAll(columnTitle, columnQuantity, columnUUID);
tableBookList.refresh();
}
正如您可以在评论中看到的那样,当前设置正在运行,但每次调用此函数时都会添加三个新列。
我搜索过但无法找到可以使用的答案。
我希望有人能告诉我问题所在。
提前致谢!
答案 0 :(得分:0)
在控制器的cellValueFactory
方法或fxml中分配initialize
,不要重新创建列。此外,调用refresh
是不必要的:
public void setTableContent(ArrayList<Book> bookList) {
ObservableList<Book> data = FXCollections.<Book>observableArrayList(new Book("Test", 1));
data.addAll(bookList);
tableBookList.setItems(data);
}
<TableView fx:id="tableBookList">
<columns>
<TableColumn fx:id="columnTitle" text="Title">
<cellValueFactory>
<PropertyValueFactory property="title"/>
</cellValueFactory>
</TableColumn>
<TableColumn fx:id="columnQuantity" text="Quantity">
<cellValueFactory>
<PropertyValueFactory property="quantity"/>
</cellValueFactory>
</TableColumn>
<TableColumn fx:id="columnUUID" text="UUID">
<cellValueFactory>
<PropertyValueFactory property="uuid"/>
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
initialize
方法@FXML
private void initialize() {
columnTitle.setCellValueFactory(new PropertyValueFactory<Book, String>("title"));
columnQuantity.setCellValueFactory(new PropertyValueFactory<Book, Integer>("quantity"));
columnUUID.setCellValueFactory(new PropertyValueFactory<Book, String>("uuid"));
}
答案 1 :(得分:0)
FXML文件已经创建了三个表列,并将它们添加到表视图的列列表中。你不应该在控制器中再次这样做。
此外,您只需要在表列上设置一次单元格值工厂,而不是每次调用setTableContent
时。所以你的控制器看起来应该是
public void initialize() {
columnTitle.setCellValueFactory(new PropertyValueFactory<Book, String>("title"));
columnQuantity.setCellValueFactory(new PropertyValueFactory<Book, Integer>("quantity"));
columnUUID.setCellValueFactory(new PropertyValueFactory<Book, String>("uuid"));
}
public void setTableContent(ArrayList<Book> bookList)
{
ObservableList<Book> data = FXCollections.<Book>observableArrayList(new Book("Test", 1));
data.addAll(bookList);
tableBookList.setItems(data);
}
或者,由于您未保留对您创建的ObservableList
的单独引用,因此您可以将setTableContent
缩减为:
public void setTableContent(ArrayList<Book> bookList)
{
tableBookList.getItems().setAll(bookList);
}
(注意,对refresh()
的调用也是多余的:表格知道其项目何时发生了变化。)