第二次作业
[实验目的]
1、掌握软件开发的基本流程
2、掌握常用的软件开发方式和工具
[实验内容]
1、设计包含登录界面的计算器
2、连接数据库,用来储存用户的历史计算记录
[实验要求]
完成软件的UI设计,使用Visio设计软件中所涉及的所有流程图
用户登录流程图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import java.awt.*; import javax.swing.*; import javax.swing.JFrame; //使窗体位于屏幕中间 public class Example10_2 { public static void main(String[] args) { JFrame window1= new JFrame(); //java提供的JFrame类的实例是一个底层容器,即通常说的窗口,其他组件必须被添加到容器中,这里是创建了一个标题为“第一个窗口”的窗口 window1.setTitle( "用户登录界面" ); window1.setBounds(800,200,330,380); window1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //用来设置窗口右上角的图标关闭后,程序会如何处理,这里的是做出”结束窗口所在的应用程序“ FlowLayout flow= new FlowLayout(); //流式布局 window1.setLayout(flow); //设置用户界面上的屏幕组件的格式布局,默认为流式布局 //按钮 JButton anniu = new JButton( "登录" ); JButton guanbi = new JButton( "关闭" ); //标签 JLabel hauny= new JLabel( " " ); JLabel xuehao= new JLabel( "用户名:" ); JLabel mima= new JLabel( "密码:" ); //输入框 JTextField xuehaowenjian= new JFormattedTextField(); JPasswordField mimawenjian= new JPasswordField(); //设置组件对象的属性 Dimension daxiao = new Dimension(250,30); xuehaowenjian.setPreferredSize(daxiao); mimawenjian.setPreferredSize(daxiao); //添加组件 window1.add(hauny); window1.add(xuehao); window1.add(xuehaowenjian); window1.add(mima); window1.add(mimawenjian); window1.add(anniu); window1.add(guanbi); window1.setVisible( true ); //窗口是否可见,true为是 } } |
登录成功:
登录失败:
计算器代码:
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.WindowConstants; import javax.swing.border.Border;import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; 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(); private JTextField jtf = new JTextField(); private 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("确定"); // JMenuItem pasteMenuItem = new JMenuItem("粘贴"); copyMenuItem.addActionListener(new meunlistent()); menu1.add(copyMenuItem); // menu1.addActionListener(new meunlistent()); menu1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // menu1.setAlignmentX(Box.RIGHT_ALIGNMENT); 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); content.add(jpb, BorderLayout.NORTH); // this.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(jbt, BorderLayout.CENTER); this.add(content, BorderLayout.WEST); setTitle("计算器"); setSize(500, 400); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String args[]) { new mainJFrame().init1(); } void init1() { init(); Statement stmt = null; ResultSet rs = null; try { String sql = "select * from mycal"; stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); rs = stmt.executeQuery(sql); while (rs.next()){ jta.append("\r\n"); jta.append(rs.getString("history")); } System.out.println("查询成功"); } catch (SQLException e1) { System.out.println("查询数据库出错"); e1.printStackTrace(); } finally { try { rs.close(); stmt.close(); con.close(); } catch (SQLException e1) { System.out.println("关闭资源出错"); e1.printStackTrace(); rs = null; stmt = null; con = null; } } } class listen implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (flag) { jtf.setText(""); flag = false; } Button temped = (Button) e.getSource(); jtf.setText(jtf.getText() + temped.getLabel()); } } class result implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == btn[22]) { String check = jtf.getText(); String pp = String.valueOf(new Solution().calculate(check)); jtf.setText(pp); init(); Statement stmt = null; PreparedStatement ps = null; ResultSet rs = null; try { String sql = "select * from mycal"; String sqlinsert = "insert into mycal(history) value(?)"; String mycount = check + "=" + pp; stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); // rs=(ResultSet) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); ps = con.prepareStatement(sqlinsert); ps.setString(1, mycount); ps.executeUpdate(); rs = stmt.executeQuery(sql); rs.last(); System.out.println("列数" + rs.getRow()); // jta.setText("历史记录"); do { jta.append("\r\n"); jta.append(rs.getString("history")); } while (rs.next()); System.out.println("查询成功"); } catch (SQLException e1) { System.out.println("查询数据库出错?"); e1.printStackTrace(); } finally { try { rs.close(); stmt.close(); con.close(); } catch (SQLException e1) { System.out.println("关闭资源出错"); e1.printStackTrace(); rs = null; stmt = null; con = null; } } flag = true; } else if (e.getSource() == btn[6]) { jtf.setText(""); } else if (e.getSource() == btn[7]) { String tempStr = jtf.getText(); jtf.setText(tempStr.substring(0, tempStr.length() - 1)); } else if (e.getSource() == btn[0]) { jtf.setText(String.valueOf(new Solution().calculate(jtf.getText() + "*" + jtf.getText()))); } } } class meunlistent implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { jta.setText("历史记录"); init(); Statement stmt = null; PreparedStatement ps = null; try { String sqldelect = "DELETE FROM mycal"; 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 { // rs.close(); stmt.close(); con.close(); } catch (SQLException e1) { System.out.println("关闭资源出错"); e1.printStackTrace(); // rs = null; stmt = null; con = null; } } } } public static void init() { try { String dbUrl = "jdbc:mysql://localhost:3306/counter?useSSL=false&serverTimezone=UTC"; String dbUserName = "root"; String dbPassword = "123456"; String jdbcName = "com.mysql.cj.jdbc.Driver"; Class.forName(jdbcName); con = DriverManager.getConnection(dbUrl, dbUserName, dbPassword); System.out.println("测试连接成功"); } catch (Exception e1) { e1.printStackTrace(); } }
import java.math.BigDecimal; public class Solution { @SuppressWarnings("null") public double calculate(String s) { int j = 0; char str[] = s.toCharArray(); char str1[] = new char[str.length]; for (int i = 0; i < str.length;) { while (i < str.length && str[i] == ' ') i++; while (i < str.length && str[i] != ' ') str1[j++] = str[i++]; while (i < str.length && str[i] == ' ') i++; } int st = 0; String ans = String.valueOf(str1) + ' '; return new BigDecimal(helper(ans, st)).setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue(); } int end = 0; public double helper(String s, int i) { double num = 0.0, prev = 0.0, sum = 0; int choose = 0; int chooseop=0; String target1=""; String target2=""; String target=""; int flag=0;//记录是否target char prevOp = '+'; double indexcount=1.0; while (i < s.length()) { target=s.substring(i,i+1); if(i+1<s.length()) target1=s.substring(i,i+2); if(i+2<s.length()) target2=s.substring(i,i+3); if((target.equals("√")||target1.equals("ln")||target2.equals("log")||target2.equals("mod"))&&flag==0) { if(target.equals("√")) {chooseop=1;i+=1;System.out.println("i"+i);} else if(target2.equals("log")) {chooseop=2;i+=3;} else if(target2.equals("mod")) {chooseop=3;i+=2;} else if(target1.equals("ln")) {chooseop=4;i+=2;} flag=1; } //数字 if (Character.isDigit(s.charAt(i))||s.charAt(i) == '.') { if (s.charAt(i) == '.') { choose = 1; i++; indexcount=1; } if (choose == 0) { num = num * 10 + (s.charAt(i++)- '0'); } else { indexcount*=0.1; num = num + (double)(s.charAt(i++)- '0')* indexcount; } } else if (s.charAt(i) == '(') { num = helper(s, ++i); i = end; } else{ switch(chooseop) { case 1: num=Math.sqrt(num); break; case 2: num=Math.log(num)/Math.log(10); break; // case 3: // prev %= num; // break; case 4: num=Math.log(num); break; case 0: break; } switch (prevOp) { case '+': sum += prev; prev = num; break; case '-': sum += prev; prev = -num; break; case '*': prev *= num; break; case '/': prev /= num; break; case 'd': prev=prev%num; break; } if (s.charAt(i) == ')') { i++; break; } prevOp = s.charAt(i);// 操作符 num = 0; // 数字重置 choose = 0; chooseop=0; target1=""; target2=""; target=""; flag=0; i++; } } end = i; return (sum + prev); } }
其界面如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具