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

Posted

技术标签:

【中文标题】如何填充在 JavaFx Scene Builder 中设计的 fxml 文件中定义的 TableView【英文标题】:How to populate a TableView that is defined in an fxml file that is designed in JavaFx Scene Builder 【发布时间】:2012-06-26 05:01:56 【问题描述】:

我想知道如何用数据填充 TableView... 我见过的所有示例都创建了一个包含列和所有内容的 TableView 并将其添加到场景中。全部在 java 代码中完成。

我想知道的:如果我在 JavaFx 场景构建器中设计我的“表单”。在那里定义所有的表和列。如何访问它以从 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。

谢谢

【问题讨论】:

【参考方案1】:

要访问 tableview,您需要定义 FXML 页面的控制器。添加

fx:controller="path.to.MyController"

归属于 FXML 文件中的AnchorPane。然后通过在这些变量前面添加@FXML 注释来创建控制器并从 FXML 文件链接 TableView、TableColumns:

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   
    

tableview 在initialize 方法中填充。请注意,在控制器中,我们不会创建新的 tableview 或 tablecolumns,因为它们已经在加载 FXML 文件时创建。另请注意,TableView 和 Tablecolumn 变量名称必须与相应 FXML 文件中的 fx:id 值相同。因此,虽然 UserId、UserName 和 Active 名称不方便命名,但在 FXML 文件和 Controller 中将它们分别更改为 userIdCol、userNameCol 和 userActiveCol 等名称。

【讨论】:

谢谢-不知道控制器:) User 类中应该包含什么内容? 感谢您的回答。快速说明:不再需要 Initializable 接口。您不必实施它。只需在您的控制器中有一个方法:@FXML private void initialize(),它将被 FXMLLoader 调用。 Proof in docs 是的@all3fox 现在它不是强制性的。将相应地更新帖子。谢谢。 尽管这是一篇旧帖子,但它拯救了我的一天。我不得不投票。【参考方案2】:

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

 @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);

【讨论】:

以上是关于如何填充在 JavaFx Scene Builder 中设计的 fxml 文件中定义的 TableView的主要内容,如果未能解决你的问题,请参考以下文章

javafx scene builider 使用总结

JavaFX:如何滚动到textarea中的特定行

导入 javafx.scene.control.Alert 无法解析

javafx中已经创建的scene的宽高能改变吗?怎么改呢?

JAVAFX中 如何设置下拉框的默认值

javafx.scene.image.Image("flower.png") 在哪里寻找flower.png?