首页 > 解决方案 > 如何使用javafx将数据从数据库加载到tableview

问题描述

我是javafx的初学者。我只是使用 java jtable 方式加载数据,但我无法将数据加载到 tableview 到目前为止我尝试过的内容我附在下面。如何将数据加载到 tableview

@FXML
private TableColumn<?, ?> table1;

public void table_load()
{
    int c;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost/addressbook", "root","");
        pst = con.prepareStatement("select * from records");
        ResultSet rs = pst.executeQuery();
        ResultSetMetaData rd = rs.getMetaData();
        c = rd.getColumnCount();
        df = (DefaultTableModel)table1.getCellData(0);
        df.setRowCount(0);

        while (rs.next())
        {
            Vector v = new Vector();
            for (int i=1; i<=c; i++)
            {
                v.add(rs.getString("id"));
                v.add(rs.getString("name"));
                v.add(rs.getString("address"));
                v.add(rs.getString("phone"));
            }
            df.addRow(v);
        }
    } catch (SQLException ex) {

    } catch (ClassNotFoundException ex) {
       Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

标签: javajavafx

解决方案


通常您不会直接将数据添加到 TableColumn。通常的方法是拥有可以添加的类型的对象。假设您的结果集将包含类型的对象,Customer并且您可以从结果集中提取一个或多个客户对象。那么您宁愿使用以下内容(需要在fxml文件中定义:

  • 像这样的上级表TableView <Customer> customerView
  • 一些表格列,如:
    • TableColumn<Customer, String> idColumn
    • TableColumn<Customer, String> nameColumn
    • TableColumn<Customer, String> addressColumn
    • TableColumn<Customer, String> phoneColumn

您需要为列设置值工厂以明确要显示哪个属性。

  • idColumn.setCellValueFactory(new PropertyValueFactory<>("[ATTRIBUTE NAME IN CUSTOMER CLASS]"));

喜欢

  • idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));

最后一步应该是用数据填充表格视图:

customerView.setItems(observableCustomers);

observableCustomers类型列表在哪里ObservableList<Customer>javafx.collections.FXCollections将帮助您在这里创建相应的对象。

它应该类似于:

@FXML
TableView <Customer> customerView;

@FXML
TableColumn<Customer, String> idColumn;
@FXML
TableColumn<Customer, String> nameColumn;
@FXML
TableColumn<Customer, String> addressColumn;
@FXML
TableColumn<Customer, String> phoneColumn;

ObservableList<Customer> observableCustomers;

// init method or constructor, whatever suits your needs
private void initTable() {

    observableCustomers = FXCollections.observableArrayList();
    idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
    addressColumn.setCellValueFactory(new PropertyValueFactory<>("address"));
    phoneColumn.setCellValueFactory(new PropertyValueFactory<>("phone"));
}

public void table_load()
{

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost/addressbook", "root","");
        pst = con.prepareStatement("select * from records");
        ResultSet rs = pst.executeQuery();
        ResultSetMetaData rd = rs.getMetaData();

        // CAST/TRANSFORMATION TO BE DONE BY YOU
        List<Customer> customerList = ((List<Customer>) rs.toList());

        // only if necessary
        observableCustomers.clear();
        // add customers
        observableCustomers.addAll(customerList);

    } catch (SQLException ex) {

    } catch (ClassNotFoundException ex) {
        Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    }

}

推荐阅读