Javafx-无需添加新列而无需添加阵列列表



我目前正在尝试用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()的调用也是多余的:该表知道其项目何时更改。(

最新更新