一、项目介绍
1.功能要求:
本课程设计是做了一个图形界面的科学计算器,其界面主要是由swing组件中的控件构成。程序实现了计算器的基本功能有:加、减、乘、除基本算术运算(可以进行浮点和负数运算),同时能进行指数运算和自然对数运算,还有退格、清零,查看历史记录功能 。
2.功能架构图
二、个人任务简述
1. 完成的任务与功能:
序号 |
完成功能与任务 |
描述 |
1 |
全局搜索功能 |
采用swing编写客户端服务器可视化界面 |
2 |
面向对象设计 |
基本完成面向对象技术设计系统 |
3 |
数据库读写编码部分 |
使用JDBC连接数据库,Dao模式读写数据,直接底层操作,提供了简单,便捷的访问数据库的方法,跨平台性较强,灵活比较强,可以执行很复杂的SQL语句。 |
4 |
数据库设计 |
采用MySQL数据库。表设计符合第三范式。 |
2.项目Git地址
https://gitee.com/li-rong-a-song/test.git
3.Git提交记录截图
三、本人负责功能详解
1. *面向对象设计
类设计说明:
2. *全局搜索功能:
2.1 采用swing编写客户端服务器可视化界面
2.2 关键代码
public class MainJFrame extends JFrame { private boolean flag = false; static Connection con = null;// 数据库 Button btn[] = new Button[] { new Button("x²"), new Button("√"), new Button("mod"), new Button("log"), new Button("("), new Button(")"), new Button("CE"), new Button("Del"), new Button("7"), new Button("8"), new Button("9"), new Button("+"), new Button("4"), new Button("5"), new Button("6"), new Button("-"), new Button("1"), new Button("2"), new Button("3"), new Button("*"), new Button("0"), new Button("."), new Button("="), new Button("/"), };// 按键部分 private JPanel content1 = new JPanel(); private JPanel content = new JPanel(); private JPanel jbt = new JPanel(); private JPanel jpb = new JPanel(); private JPanel jpa = new JPanel(); public JTextField jtf = new JTextField(); public JTextArea jta = new JTextArea("历史记录"); public MainJFrame() { content.setLayout(new BorderLayout()); content1.setLayout(new BorderLayout()); jta.setEditable(false); jta.setBackground(Color.white); jta.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 20)); jpa.setLayout(new BorderLayout()); Border border = BorderFactory.createLineBorder(Color.BLACK); jta.setBorder(BorderFactory.createCompoundBorder(border, BorderFactory.createEmptyBorder(10, 10, 10, 10))); jta.setLineWrap(true); JScrollPane scrollPane = new JScrollPane(jta, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); add(scrollPane); content1.add(jpa); this.add(content1, BorderLayout.EAST); JMenuBar menuBar = new JMenuBar(); JMenu menu1 = new JMenu("清空历史"); JMenuItem copyMenuItem = new JMenuItem("确定"); copyMenuItem.addActionListener(new Menulistent()); menu1.add(copyMenuItem); menu1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); menuBar.add(menu1); setJMenuBar(menuBar); jtf.setPreferredSize(new Dimension(300, 100)); jtf.setEditable(false); jtf.setBackground(Color.white); jtf.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 50)); jtf.setHorizontalAlignment(JTextField.RIGHT); jpb.setLayout(new BorderLayout()); jpb.add(jtf); content.add(jpb, BorderLayout.NORTH); jbt.setLayout(new GridLayout(6, 4)); for (int i = 0; i < btn.length; i++) { jbt.add(btn[i]); if (i != 22 && i != 7 && i != 6 && i != 0) btn[i].addActionListener(new Listen()); else btn[i].addActionListener(new Result()); } content.add(jbt, BorderLayout.CENTER); this.add(content, BorderLayout.WEST); setTitle("计算器"); setSize(500, 400); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); }
3. *数据库读写编码部分
3.1 使用JDBC连接数据库,并用Dao模式读写数据
3.2 关键代码
public class CounterDaoImpl implements CounterDao { //JTextField jtf = new JTextField(); //JTextArea jta = new JTextArea("历史记录"); @Override public void insert(Counter cal) { Connection conn = null; PreparedStatement ps = null; String sql = "insert into mycal(history) value(?)"; try { conn = JDBCUtil.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, cal.getHistory()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); System.out.println("添加数据失败"); } } @Override public void delete() { Statement stmt = null; PreparedStatement ps = null; Connection con = null; try { String sqldelect = "DELETE FROM mycal"; con = JDBCUtil.getConnection(); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ps = con.prepareStatement(sqldelect); ps.executeUpdate(); // jta.setText("历史记录"); System.out.println("删除成功"); } catch (SQLException e1) { System.out.println("查询数据库出错"); e1.printStackTrace(); } finally { try { stmt.close(); con.close(); } catch (SQLException e1) { System.out.println("关闭资源出错"); e1.printStackTrace(); stmt = null; con = null; } } } @Override public void diplayAllCal() { String sql = "select * from mycal";// 表中有id和history这列 try (Connection conn = JDBCUtil.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql);) { ResultSet rs = pstat.executeQuery(sql); while (rs.next()) { int id = rs.getInt("id"); String history = rs.getString("history"); System.out.format("历史记录id=%d,运算为=%s\n", id, history); } } catch (SQLException e1) { System.out.println("查询数据库出错"); e1.printStackTrace(); } } }
4. 数据库设计
4.1 简述数据库设计
根据系统需要,设计了一个mycal表,表中有两列数据history和id
history:代表运算式,id:表示表中序号
4.2 数据库表设计
4.3 难点及解决方法
时常出现Mysql启动失败的提示,查询了许多在mac中配置并启动Mysql的教程;在命令行中创建数据库表无法明显感受到数据是否读写,使用Sequel Ace连接Mysql后实现数据库的可视化。
四、课程设计感想
课程设计是一个考验综合能力的大型考核任务,不是一朝一夕的学习理论知识就能够完善所有功能任务的,同时如此庞大的体系也需要一些合作共享相互帮助集思广益效果才会更好,此次设计由我个人完成,不能及时地发现问题解决问题,甚是感受到了团队合作的重要性,也充分认识到了编写一些可视化前端面板能使系统程序更加人性化,用户使用起来更加简单明了方便快捷。在本次课程设计中,由于想实现查看历史记录功能但是并不完全熟悉数据库这部分内容,导致绕了很多弯路,遇到了很多错误,最后在csdn和哔哩哔哩视频教程的帮助下较为顺利地解决了,但也仍有很多问题。本是抱着面向对象设计的思想,实现用Dao模式读写数据库,但由于能力不足,我想不到如何将数据库内容展现在GUI界面中达到可视的目的,为此只能前端和后端交叉重叠了部分,可能未完全达到我的设计预期。
五、尚待改进或者新的想法
1. 自己所完成功能的不足之处及以后想要采取的改进方法。
1) 运算功能有限,尚未完成三角函数类运算。以后可以增加一些三角函数的运算方法,完善计算器的界面。
2) 尚未支持键盘快捷键,未完善复制粘贴功能。目前还没有对此的改进思路。
3) 没有实现多线程,不能提供网络计算服务。以后完善实现多线程技术,进一步完善计算功能。
2. 课设后想要进一步做的事情:
通过此次课程设计,我了解到自身的不足还有很多。此次设计过程我也学到了很多,对很多技术有了更进一步的认识,也有了更多兴趣。我想进一步学习GUI界面编程和数据库技术,能用一行行代码来实现可视化编程确实是很神奇;而数据的存储除了文件存储,数据库确实是一个更好的选择,能实现数据共享,完成数据集中控制、增加数据维护性、提高数据安全性。
标签:Button,计算器,JPanel,面向对象,add,科学,new,null,数据库 From: https://www.cnblogs.com/asong-0112/p/17037331.html