Javafx - 使用arraylist填充tableview而不添加新列

时间:2017-04-19 19:22:40

标签: arraylist javafx tableview

我目前正在尝试使用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();
}

正如您可以在评论中看到的那样,当前设置正在运行,但每次调用此函数时都会添加三个新列。

我搜索过但无法找到可以使用的答案。

我希望有人能告诉我问题所在。

提前致谢!

2 个答案:

答案 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);
}

版本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"));
}

答案 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()的调用也是多余的:表格知道其项目何时发生了变化。)