如何用数据库数据填充TableView

我一直在尝试使用从数据库查询的数据加载TableView,但似乎无法使其工作。

这是我尝试用数据库查询项填充数据库的第一次尝试,以防我的代码看起来很糟糕而且远非好。

FXML是通过JavaFx SceneBuilder完成的。

这是数据库查询类:

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.TableView; public class StudentInfo { static String JDBC_DRIVER = "org.h2.Driver"; static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static Connection conn = null; @FXML private TableView lovelyStudents; private ObservableList data; // Public static ObservableList getAllCOA(){ public void getAllstudentInfo() { Statement st = null; ResultSet rs; String driver = "org.h2.Driver"; try { Class.forName(driver); conn = DriverManager.getConnection(DB_URL, USER, PASS); st = conn.createStatement(); String recordQuery = ("SELECT id, KIWI FROM KIWI"); rs = st.executeQuery(recordQuery); while (rs.next()) { ObservableList row = FXCollections.observableArrayList(); for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { row.add(rs.getString(i)); System.out.println(row); } data.add(row); } lovelyStudents.setItems(data); } catch (ClassNotFoundException | SQLException ex) { // CATCH SOMETHING } } } 

这是通过JavaFx场景构建器生成的FXML脚本:

                

以下是从tableView中填充数据的最佳解决方案。

 import java.sql.Connection; import java.sql.ResultSet; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.control.TableView; import javafx.stage.Stage; import javafx.util.Callback; /** * * @author Narayan */ public class DynamicTable extends Application{ //TABLE VIEW AND DATA private ObservableList data; private TableView tableview; //MAIN EXECUTOR public static void main(String[] args) { launch(args); } //CONNECTION DATABASE public void buildData(){ Connection c ; data = FXCollections.observableArrayList(); try{ c = DBConnect.connect(); //SQL FOR SELECTING ALL OF CUSTOMER String SQL = "SELECT * from CUSTOMer"; //ResultSet ResultSet rs = c.createStatement().executeQuery(SQL); /********************************** * TABLE COLUMN ADDED DYNAMICALLY * **********************************/ for(int i=0 ; i,ObservableValue>(){ public ObservableValue call(CellDataFeatures param) { return new SimpleStringProperty(param.getValue().get(j).toString()); } }); tableview.getColumns().addAll(col); System.out.println("Column ["+i+"] "); } /******************************** * Data added to ObservableList * ********************************/ while(rs.next()){ //Iterate Row ObservableList 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"); } } @Override public void start(Stage stage) throws Exception { //TableView tableview = new TableView(); buildData(); //Main Scene Scene scene = new Scene(tableview); stage.setScene(scene); stage.show(); } } 

这是参考

谢谢..