如何填充在JavaFx Scene Builder中定义的fxml文件中的TableView?

24
我想知道如何使用数据填充TableView......我看到的所有示例都是在Java代码中创建TableView并为其添加列和其他内容,然后将其添加到场景中。
我想知道的是:如果我在JavaFX Scene Builder中设计了我的“表单”,定义了其中的所有表格和列,那么我该如何从Java中访问它以填充数据?或者是否有人可以指向一个适当的教程?
我已经在JavaFX Scene Builder中定义了我的表单 - 仅带有3个列的TableView。
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="288.0" prefWidth="293.0" xmlns:fx="http://javafx.com/fxml">
<children>
    <TableView fx:id="tableView" layoutX="35.0" layoutY="28.0" prefHeight="200.0" prefWidth="227.0">
    <columns>
        <TableColumn prefWidth="75.0" text="UserId" fx:id="UserId" />
        <TableColumn prefWidth="75.0" text="UserName" fx:id="UserName" />
        <TableColumn prefWidth="75.0" text="Active" fx:id="Active" />
    </columns>
    </TableView>
</children>
</AnchorPane>

我的Java代码中有一个ResultSet存储了数据。

ResultSet rs = c.createStatement().executeQuery(SQL);

我需要填充TableView。

谢谢

2个回答

61

要访问表格视图,您需要定义FXML页面的控制器。添加:

fx:controller="path.to.MyController"

在FXML文件中,将attribute添加到AnchorPane。然后创建控制器,并通过在这些变量之前放置@FXML注释来从FXML文件中链接TableViewTableColumns

package path.to;

public class MyController implements Initializable {

    @FXML private TableView<User> tableView;
    @FXML private TableColumn<User, String> UserId;
    @FXML private TableColumn<User, String> UserName;
    @FXML private TableColumn<User, String> Active;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        UserId.setCellValueFactory(new PropertyValueFactory<User, String>("id"));
        UserName.setCellValueFactory(new PropertyValueFactory<User, String>("name"));
        Active.setCellValueFactory(new PropertyValueFactory<User, String>("active"));

        tableView.getItems().setAll(parseUserList());
    }
    private List<User> parseUserList(){
        // parse and construct User datamodel list by looping your ResultSet rs
        // and return the list   
    }
}

initialize方法中填充了tableview。请注意,在控制器中,我们没有创建新的tableview或tablecolumns,因为它们已经在加载FXML文件时被创建。还要注意,在对应的FXML文件中,TableView和TableColumn变量名必须与fx:id值相同。所以尽管UserId、UserName和Active不是方便的命名方式,但需要在FXML文件和Controller中将它们改为诸如userIdCol、userNameCol和userActiveCol这样的名称。


4
用户类应该包含什么? - Chiranjib
4
谢谢你的回答。简短说明一下:Initializable接口不再是必需的,你无需实现它。只需在你的控制器中添加一个方法: @FXML private void initialize(),FXMLLoader将自动调用它。 文档证明 - alisianoi
1
是的 @all3fox ,现在不再强制了。会相应地更新帖子。谢谢。 - Uluk Biy
1
尽管这是一篇旧帖子,但它救了我的一天。我必须点赞它。 - CN1002
有趣的是,我使用了'all3fox'建议的方法,但IntelliJ IDEA将方法initialize()标记为从未使用过。尽管如此,它仍然可以正常工作。 - Mario Geuenich
显示剩余4条评论

1

您可以在控制器中执行此操作:

 @FXML
private TableView<User> table;
private List<User> users;

@Override
public void initialize(URL url, ResourceBundle rb) {
    // Set the columns width auto size
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    table.getColumns().get(0).prefWidthProperty().bind(table.widthProperty().multiply(0.33));    // 33% for id column size
    table.getColumns().get(1).prefWidthProperty().bind(table.widthProperty().multiply(0.33));   // 33% for dt column size
    table.getColumns().get(2).prefWidthProperty().bind(table.widthProperty().multiply(0.33));    // 33% for cv column size
    table.getItems().setAll(this.users);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接