java - 如何使用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);
}
}
解决方案
通常您不会直接将数据添加到 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);
}
}