在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();
}
}
很抱歉,我作为一名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看下
如果数据有了,再看 饼图的逻辑有没有问题,找一下官方文档看下,添加数据的步骤有没有问题