在vscode上用JFreechart画了个饼图为什么显示不出来?

在vscode上用JFreechart画了个饼图为什么显示不出来? 这里是代码,哪里出了问题?

package account;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.jfree.chart.ChartFrame;
import org.jfree.data.general.DefaultPieDataset;

public class AccountSystem extends JFrame implements ActionListener {
    private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost:3306/moneycount?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
    
    // 数据库用户名密码
    private static final String USER = "root";
    private static final String PASS = "!@#$8765";
    
    private JLabel typeLabel;
    private JComboBox<String> typeComboBox;
    private JLabel moneyLabel;
    private JTextField moneyField;
    private JLabel dateLabel;
    private JTextField dateField;
    private JButton addButton;
    private JButton queryButton;
    private JTable table;
    private JScrollPane scrollPane;
    
    public AccountSystem() {
        this.setTitle("记账系统");
        this.setSize(500, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(5, 2));
        
        /*titleLabel = new JLabel("记账系统");
        titleLabel.setFont(new Font("宋体", Font.BOLD, 22));
        panel.add(titleLabel);*/
        
        typeLabel = new JLabel("类型:");
        panel.add(typeLabel);
        
        String[] types = {"收入", "支出"};
        typeComboBox = new JComboBox<String>(types);
        panel.add(typeComboBox);
        
        moneyLabel = new JLabel("金额:");
        panel.add(moneyLabel);

        moneyField = new JTextField(20);
        panel.add(moneyField);
        
        dateLabel = new JLabel("日期:");
        panel.add(dateLabel);
        
        dateField = new JTextField(20);
        panel.add(dateField);
        
        addButton = new JButton("添加记录");
        addButton.addActionListener(this);
        panel.add(addButton);
        
        queryButton = new JButton("查询记录");
        queryButton.addActionListener(this);
        panel.add(queryButton);
        
        this.add(panel, BorderLayout.NORTH);
        
        table = new JTable();
        scrollPane = new JScrollPane(table);
        this.add(scrollPane, BorderLayout.CENTER);
        
        this.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == addButton) {
            String type = (String)typeComboBox.getSelectedItem();
            double money = Double.parseDouble(moneyField.getText());
            String date = dateField.getText();
            
            Connection conn = null;
            Statement stmt = null;
            
            try {
                // 注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
                
                // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL,USER,PASS);
                
                // 执行插入操作
                System.out.println("实例化Statement对象...");
                stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                String sql;
                sql = "INSERT INTO account (type, money, date) VALUES ('" + type + "', " + money + ", '" + date + "')";
                int result = stmt.executeUpdate(sql);
                
                if (result > 0) {
                    JOptionPane.showMessageDialog(this, "添加成功!");
                } else {
                    JOptionPane.showMessageDialog(this, "添加失败!");
                }
                // 完成后关闭
                stmt.close();
                conn.close();
            } catch(SQLException se) {
                // 处理 JDBC 错误
                se.printStackTrace();
            } catch(Exception ex) {
                // 处理 Class.forName 错误等其他错误
                ex.printStackTrace();
            } finally {
                // 关闭资源
                try {
                    if(stmt!=null)
                    stmt.close();
                } catch(SQLException se2) {

                }
                try {
                    if(conn!=null)
                    conn.close();
                } catch(SQLException se) {
                    se.printStackTrace();
                }
            }
        } else if (e.getSource() == queryButton) {
            Connection conn = null;
            Statement stmt = null;
            
            try {
                // 注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
                
                // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL,USER,PASS);
                
                // 执行查询
                System.out.println("实例化Statement对象...");
                stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                String sql;
                sql = "SELECT id, type, money, date FROM account";
                ResultSet rs = stmt.executeQuery(sql);
                
                // 创建表格模型
                DefaultTableModel model = new DefaultTableModel();
                // 设置表格列名
                String[] columnNames = {"ID", "类型", "金额", "日期"};
                model.setColumnIdentifiers(columnNames);
                
                // 遍历结果集并添加到表格模型中
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String type = rs.getString("type");
                    double money = rs.getDouble("money");
                    Date date = rs.getDate("date");
                    
                    Object[] rowData = {id, type, money, date};
                    model.addRow(rowData);
                }
                
                // 将表格模型绑定到表格控件中
                table.setModel(model);
                
                // 绘制饼图
                int incomeCount = 0;
                int expenseCount = 0;
                double incomeAmount = 0;
                double expenseAmount = 0;
                
                rs.beforeFirst();
                while (rs.next()) {
                    String type = rs.getString("type");
                    double money = rs.getDouble("money");
                    
                    if ("收入".equals(type)) {
                        incomeCount++;
                        incomeAmount += money;
                    } else if ("支出".equals(type)) {
                        expenseCount++;
                        expenseAmount += money;
                    }
                }
                JFreeChart chart = ChartFactory.createPieChart(
                    "收支比例图",
                    createDataset(incomeCount, expenseCount),
                    true,
                    true,
                    false
                    );
                
                    
            
                    
                    ChartFrame chartFrame = new ChartFrame("收支比例图",(org.jfree.chart.JFreeChart) chart);
                    chartFrame.pack();
                    chartFrame.setVisible(true);
                    
                    // 完成后关闭
                    rs.close();
                    stmt.close();
                    conn.close();
                } catch(SQLException se) {
                    // 处理 JDBC 错误
                    se.printStackTrace();
                } catch(Exception ex) {
                    // 处理 Class.forName 错误等其他错误
                    ex.printStackTrace();
                } finally {
                    // 关闭资源
                    try {
                        if(stmt!=null)
                        stmt.close();
                    } catch(SQLException se2) {

                    }
                    try {
                        if(conn!=null)
                        conn.close();
                    } catch(SQLException se) {
                        se.printStackTrace();
                    }
                }
            }
        }
        
        private DefaultPieDataset createDataset(int incomeCount, int expenseCount) {
            DefaultPieDataset dataset = new DefaultPieDataset();
            dataset.setValue("收入", incomeCount);
            dataset.setValue("支出", expenseCount);
            return dataset;
        }
        
        public static void main(String[] args) {
            new AccountSystem();
            

        }
}

img

很抱歉,我作为一名AI语言模型,并不具备实际解决问题的能力。不过,我可以为您提供一些指导来帮助您解决这个问题。

首先,您需要确保在vscode中安装了JFreechart和相应的库。您可以在vscode中打开命令行工具,输入以下命令来检查是否已经安装了JFreechart库:

java -jar org.jfree.chart.api.jar!/JFreeChart-1.6.1.jar

如果已经安装了库,接下来您需要检查您的代码中是否存在以下错误:

  • 缺少@Override关键字
  • 缺少public关键字
  • 缺少public class语句

如果您发现以上错误,请将它们修复并重新运行您的代码。

接下来,您需要检查您的代码是否在正确的位置定义了JFreeChart类。您需要确保类名和字段名与在JFreechart库中定义的类名和字段名相同。如果您使用的是自定义类,需要将其声明为public并且包含@Override关键字。

最后,如果您仍然无法显示饼图,请检查您的代码是否包含import语句。如果您使用了其他库或框架,需要将其替换为JFreechart库的引用。

希望这些指导能够帮助您解决问题。

首先检查一下 饼图的数据有没有查出来,可以debug看下
如果数据有了,再看 饼图的逻辑有没有问题,找一下官方文档看下,添加数据的步骤有没有问题