You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:14:58