JavaFX笔记应用无法从数据库加载分类数据求助
问题:JavaFX笔记应用分类无法在TableView显示
开发笔记应用时,分类数据可成功存入数据库,但TableView始终为空,无法加载显示数据。以下是相关代码:
ViewCategories.java
package com.example.noteapp; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.MenuBar; import javafx.scene.control.TableView; import javafx.scene.control.TableColumn; import javafx.scene.control.Menu; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; public class ViewCategories { @FXML private Stage primaryStage; // Declare the Stage reference public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; } @FXML private Menu createnote; @FXML private Menu viewnote; @FXML private Menu takenote; @FXML private MenuBar optionmenu; @FXML private TableView<Categories> categorytab; @FXML private TableColumn<Categories, String> categoryname; @FXML private TableColumn<Categories, Integer> catid; @FXML private TableColumn<Categories, Date> created_date; public void initialize() { catid.setCellValueFactory(new PropertyValueFactory<>("id")); categoryname.setCellValueFactory(new PropertyValueFactory<>("category_name")); created_date.setCellValueFactory(new PropertyValueFactory<>("created_date")); viewCategories(); } @FXML public void viewCategories(){ String url = "jdbc:mysql://localhost:3306/noteapp"; String user = "root"; String pass = ""; try{ Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(url,user,pass); String sql = "Select * from category"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet resultSet = statement.executeQuery(); ObservableList<Categories> categories = FXCollections.observableArrayList(); while (resultSet.next()) { int id = resultSet.getInt("catid"); String category_name = resultSet.getString("categoryname"); Date created_date = resultSet.getDate("created_date"); Categories category = new Categories(id,category_name,created_date); categories.add(category); } categorytab.setItems(categories); resultSet.close(); statement.close(); connection.close(); // showAlert("Successfully login", "Login as "+u); }catch(Exception e){ System.out.println("Connection failed."); } } }
Categories.java
package com.example.noteapp; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.scene.control.MenuBar; import javafx.stage.Stage; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.io.IOException; public class Categories { private int id; private String categoryName; private Date createdDate; public int getId() { return id; } public String getCategory_name() { return categoryName; } public Date getCreated_date() { return createdDate; } @FXML private Stage primaryStage; // Declare the Stage reference public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; } public Categories(){} public Categories(int id, String categoryName, Date createdDate) { this.id = id; this.categoryName = categoryName; this.createdDate = createdDate; } @FXML private TextField categoryid; @FXML private Button createbtn; @FXML private Menu view; @FXML private MenuBar menubar; @FXML public void createCategory(){ String url = "jdbc:mysql://localhost:3306/noteapp"; String user = "root"; String pass = ""; try{ Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(url,user,pass); String sql = "insert into category(category_name) values (?)"; PreparedStatement statement = connection.prepareStatement(sql); String cat = categoryid.getText(); statement.setString(1, cat); statement.executeUpdate(); showAlert("Created Successful", "201 created!"); }catch(Exception e){ System.out.println("Connection failed."); } } @FXML public void showCategories(){ try { FXMLLoader loader = new FXMLLoader(getClass().getResource("categorylist.fxml")); AnchorPane categoryLayout = loader.load(); Scene loginScene = new Scene(categoryLayout); // Access the controller of the login.fxml file and pass the primaryStage reference ViewCategories categoriesController = loader.getController(); categoriesController.setPrimaryStage(primaryStage); primaryStage.setScene(loginScene); } catch (IOException e) { e.printStackTrace(); } } private void showAlert(String title, String message) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle(title); alert.setHeaderText(null); alert.setContentText(message); alert.showAndWait(); } }
解决办法
1. 修正JavaBean getter命名规范
PropertyValueFactory遵循JavaBean规范,根据属性名查找对应getter方法:属性名categoryName对应getCategoryName(),而非getCategory_name()。代码中存在命名不匹配问题,需修改两处:
- 修改
Categories类的getter方法:
public String getCategoryName() { return categoryName; } public Date getCreatedDate() { return createdDate; }
- 修改
ViewCategories初始化方法中的属性名参数:
public void initialize() { catid.setCellValueFactory(new PropertyValueFactory<>("id")); categoryname.setCellValueFactory(new PropertyValueFactory<>("categoryName")); created_date.setCellValueFactory(new PropertyValueFactory<>("createdDate")); viewCategories(); }
2. 完善异常处理
当前异常提示过于模糊,替换为打印完整异常栈信息,方便定位问题:
catch(Exception e){ e.printStackTrace(); }
3. 检查FXML绑定
确认categorylist.fxml中:
- TableView的
fx:id为categorytab - 各TableColumn的
fx:id分别为catid、categoryname、created_date - 列的类型与代码定义一致(如
categoryname对应String类型)
4. 验证数据库查询结果
在viewCategories方法中添加打印语句,确认是否从数据库获取到数据:
while (resultSet.next()) { int id = resultSet.getInt("catid"); String category_name = resultSet.getString("categoryname"); Date created_date = resultSet.getDate("created_date"); System.out.println("查询到分类:" + id + " " + category_name + " " + created_date); Categories category = new Categories(id,category_name,created_date); categories.add(category); }
内容的提问来源于stack exchange,提问作者lony235
相关产品推荐
相关产品推荐

