当前位置: 首页 > 知识库问答 >
问题:

用数据库中的内容填充TableView

刘意
2023-03-14

我知道这个问题已经问了100次了,但我还是没办法让它奏效。我希望TableView中充满存储在数据库中的内容。

我用一个空的TableView得到了我的FXML(这里的第一个问题:我应该已经设置列了吗?)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sopraFx.extended.view.UserEditView">
    <children>
        <MenuBar layoutY="2.0" prefHeight="32.0" prefWidth="507.0">

        </MenuBar>
        <Button fx:id="logoutButton" layoutX="506.0" layoutY="2.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefHeight="31.0" prefWidth="92.0" text="Zurück" />
      <TextField fx:id="tableEditName" layoutX="369.0" layoutY="59.0" prefHeight="31.0" prefWidth="124.0" promptText="Username" />
      <TextField fx:id="tableEditPassword" layoutX="369.0" layoutY="115.0" prefHeight="31.0" prefWidth="124.0" promptText="Password" />
      <TextField fx:id="tableEditEmail" layoutX="369.0" layoutY="165.0" prefHeight="31.0" prefWidth="124.0" promptText="E-Mail" />
      <Button fx:id="editButton" defaultButton="true" layoutX="527.0" layoutY="363.0" mnemonicParsing="false" text="Save" />
      <Label layoutX="14.0" layoutY="64.0" text="you want to edit" />
      <TableView fx:id="userEditTable" layoutX="6.0" layoutY="34.0" prefHeight="311.0" prefWidth="286.0">

      </TableView>
    </children>
</AnchorPane>

这就是我从数据库中获取数据并进入TableView的方法。我把som系统打印出来,检查它是否给了我正确的东西。问题是我在“tableview.getColums().addAll.col”中得到了NullPointerExpections

这是代码:

    public void initialize() {


        TableView tableview = getUserTable();
        ObservableList<ObservableList> data;
        Connection c;
        data = FXCollections.observableArrayList();
        try{
            c = Database.getConnection();
            String SQL = "SELECT * FROM User";
            ResultSet rs = c.createStatement().executeQuery(SQL);

            for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
                //We are using non property style for making dynamic table
                final int j = i;
                TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
                col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
                    public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
                        return new SimpleStringProperty(param.getValue().get(j).toString());
                    }
                });

                tableview.getColumns().addAll(col);
                System.out.println("Column ["+i+"] ");
            }
            while(rs.next()){
                //Iterate Row
                ObservableList<String> row = FXCollections.observableArrayList();
                for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                    //Iterate Column
                    row.add(rs.getString(i));
                }
                System.out.println("Row [1] added "+row );
                data.add(row);

            }
            //FINALLY ADDED TO TableView
            tableview.setItems(data);
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Error on Building Data");
        }

    }

我通过那个教程得到了方法:http://blog.ngopal.com.np/2011/10/19/dyanmic-tableview-data-from-database/comment-page-1/

编辑:

在控制器中,我使用以下方法来显示场景。

 private Parent sceneUserEdit;
 private UserEditView viewUserEdit;
public Parent userEditScene() throws SQLException {
    Stage userEditStage = new Stage();
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("../view/UserEdit.fxml"));
    try {
        sceneUserEdit = loader.load();
        userEditStage.setTitle("SoPra JavaFX");
        userEditStage.setScene(new Scene(sceneUserEdit, 600, 400));
        userEditStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
    viewUserEdit = loader.getController();
    viewUserEdit.setSimpleController(this);
    initialize();


    return sceneUserEdit;

}

初始化方法在控制器中。在UserEditView类中,我为整个TableView和每个TableColumn获得了FXMLs,并为这些TableView和每个TableColumn提供了getter

    @FXML
    private TableView<User> userTable;
public TableView<User> getUserTable(){return userTable;}

共有1个答案

闾丘选
2023-03-14

在您的FXML文件中

xml prettyprint-override"><TableView fx:id="userEditTable" ... />

但在控制器中

@FXML
private TableView<User> userTable;

字段名称需要与fx:id匹配。

 类似资料:
  • 简介 Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是更应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义的一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。 编写 See

  • 问题内容: 我一直在尝试使用从数据库查询的数据加载TableView,但似乎无法使其正常工作。 这是我第一次尝试用数据库查询项填充数据库的情况,以防我的代码看起来杂乱无章,而且效果不佳。 FXML是通过JavaFx SceneBuilder完成的。 这是数据库查询类: 这是通过JavaFx场景生成器生成的FXML脚本: 问题答案: 这是将数据从数据库填充到tableView的最佳解决方案。 这是参

  • 问题内容: 我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder jTable。 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回其中包含参数数据和列的tableModel,因为我知道在GUI中执行此方法是一种不好的做法。在线上的所有教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它看不到数据和列,

  • 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回包含参数数据和列的tableModel,因为我知道在我的GUI中使用这种方法是不好的做法。所有在线教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它无法看到数据和列,因为它们是在我的方法的一个不可访问的部分中声明和使用的。在我完成这些之后,我需要找到一种方法来将它传递给我的GUI类

  • 我习惯于使用Arraylist,下面您可以看到我为存储数据所做的尝试: 这就是我尝试过的,但遗憾的是,这并不奏效: 下面你可以找到我剩下的代码,但上面的一个应该足以让我清楚的想要做什么... } 我创建了Dao类,如下所示::- @DAO公共接口DeckBuilderDao{