我目前正在尝试用arraylist填充javafx GUI中的表格,并且或多或少地工作。
这是我的代码:
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();
}
您可以在注释中阅读,当前设置正在工作,但每次称为此功能时添加三个新列。
我搜索但找不到可以使用的答案。
我希望有人可以告诉我我的问题在哪里。
预先感谢!
在控制器的initialize
方法或FXML中分配cellValueFactory
s,并且不重新创建列。此外,请致电refresh
是不必要的:
public void setTableContent(ArrayList<Book> bookList) {
ObservableList<Book> data = FXCollections.<Book>observableArrayList(new Book("Test", 1));
data.addAll(bookList);
tableBookList.setItems(data);
}
版本1:使用FXML
<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>
版本2:使用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"));
}
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()
的调用也是多余的:该表知道其项目何时更改。(