四则运算升级
之前写的四则运算中,存在以下问题:
(1)、每个组件的位置是提前设置好的,并且采用的是空布局,导致一次只能看到一条式子。
(2)、没有安全性。
因此,从以下方面进行升级:
(1)、界面布局修改升级。
(2)、增加登录功能
首先,给出PSP2下的标准步骤流程:
.PSP表格:
预计耗时(分钟) | 实际耗时(分钟) | ||
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 90 | 90 |
Analysis | 需求分析 | 10 | 10 |
Design Spec | 生成设计文档 | 0 | 0 |
Design Review | 设计复审(和同事审核设计文档) | 0 | 0 |
Coding Standerd | 代码规范(为目前的开发制定合适的规范) | 5 | 5 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 90 | 90 |
Code Review | 代码复审 | 10 | 10 |
Text | 测试(自测,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 10 | 10 |
Text Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 20 |
Sum | 合计 | 325 | 335 |
以下是界面升级后的代码:
text1_1.java
import javax.swing.*; import java.awt.*; import java.awt.event.*; //设置界面框架 public class text1_1 { public static void main(String[] args) { Win win = new Win(); win.setTitle("四则运算"); win.setBounds(0,0,500,200); } } //设置界面 class Win extends JFrame{ Win(){ //setLayout(null);//空布局 setLayout(new FlowLayout(FlowLayout.CENTER));//流体布局 Container con = getContentPane();//设置底层容器 con.setBackground(Color.blue); init(); setBounds(10,10,460,360); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } void init(){ JButton button1 = new JButton("加法题目"); JTextArea textshow1 = new JTextArea(); JButton button2 = new JButton("减法题目"); JTextArea textshow2 = new JTextArea(); JButton button3 = new JButton("乘法题目"); JTextArea textshow3 = new JTextArea(); JButton button4 = new JButton("除法题目"); JTextArea textshow4 = new JTextArea(); JButton button6 = new JButton("重置"); textshow1.setFont(new Font("楷体",Font.BOLD,20));//修改字体样式 textshow2.setFont(new Font("楷体",Font.BOLD,20)); textshow3.setFont(new Font("楷体",Font.BOLD,20)); textshow4.setFont(new Font("楷体",Font.BOLD,20)); Listen listen = new Listen(); listen.setJTextArea1(textshow1); listen.setJTextArea2(textshow2); listen.setJTextArea3(textshow3); listen.setJTextArea4(textshow4); button1.addActionListener(listen); button2.addActionListener(listen); button3.addActionListener(listen); button4.addActionListener(listen); button6.addActionListener(listen); button1.setBounds(10,10,100,25); textshow1.setBounds(110,10,200,25); button2.setBounds(10,40,100,25); textshow2.setBounds(110,40,200,25); button3.setBounds(10,70,100,25); textshow3.setBounds(110,70,200,25); button4.setBounds(10,100,100,25); textshow4.setBounds(110,100,200,25); button6.setBounds(350,50,100,25); add(button1); add(textshow1); add(button2); add(textshow2); add(button3); add(textshow3); add(button4); add(textshow4); add(button6); } } //设置监视器 class Listen implements ActionListener{ JTextArea textshow1; JTextArea textshow2; JTextArea textshow3; JTextArea textshow4; int numberOne; int numberTwo; public void setJTextArea1(JTextArea textshow1) { this.textshow1 = textshow1; } public void setJTextArea2(JTextArea textshow2) { this.textshow2 = textshow2; } public void setJTextArea3(JTextArea textshow3) { this.textshow3 = textshow3; } public void setJTextArea4(JTextArea textshow4) { this.textshow4 = textshow4; } public void setnumberOne(int numberOne) { this.numberOne = numberOne; } public void setnumberTwo(int numberTwo) { this.numberTwo = numberTwo; } public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if(str.equals("加法题目")) { numberOne = (int)(Math.random()*100); numberTwo = (int)(Math.random()*100); setnumberOne(numberOne); setnumberTwo(numberTwo); int sum1 = numberOne + numberTwo; textshow1.append(numberOne+"+"+numberTwo+"="+sum1+"\r\n"); } if(str.equals("减法题目")) { numberOne = (int)(Math.random()*100); numberTwo = (int)(Math.random()*100); setnumberOne(numberOne); setnumberTwo(numberTwo); int sum2 = numberOne - numberTwo; textshow2.append(numberOne+"-"+numberTwo+"="+sum2+"\r\n"); } if(str.equals("乘法题目")) { numberOne = (int)(Math.random()*100); numberTwo = (int)(Math.random()*100); setnumberOne(numberOne); setnumberTwo(numberTwo); int sum3 = numberOne * numberTwo; textshow3.append(numberOne+"*"+numberTwo+"="+sum3+"\r\n"); } if(str.equals("除法题目")) { numberOne = (int)(Math.random()*100); numberTwo = (int)(Math.random()*100); setnumberOne(numberOne); setnumberTwo(numberTwo); float sum4 =(float) numberOne / numberTwo; textshow4.append(numberOne+"/"+numberTwo+"="+sum4+"\r\n"); } if(str.equals("重置")){ textshow1.setText(""); textshow2.setText(""); textshow3.setText(""); textshow4.setText(""); } } }
界面Login.java
import java.awt.Dimension; //封装了一个构件的高度和宽度 import java.awt.FlowLayout; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JPasswordField; import javax.swing.JButton; public class Login { //在类中定义主函数 public static void main(String[] args) { // TODO Auto-generated method stub //在主函数中,实例化Login类的对象,调用初始化界面的方法 Login login = new Login(); login.initUI(); } //在类中定义初始化界面的方法 public void initUI() { //在initUI中实例化JFrame类的对象 JFrame frame = new JFrame(); //设置窗体对象的属性值 frame.setTitle("Login");//设置窗体标题 frame.setSize(400, 250);//设置窗体大小,只对顶层容器生效 frame.setDefaultCloseOperation(3);//设置窗体关闭操作,3表示关闭窗体退出程序 frame.setLocationRelativeTo(null);//设置窗体相对于另一组间的居中位置,参数null表示窗体相对于屏幕的中央位置 frame.setResizable(false);//禁止调整窗体大小 frame.setFont(new Font("宋体",Font.PLAIN,14));//设置字体,显示格式正常,大小 //实例化FlowLayout流式布局类的对象,指定对齐方式为居中对齐组件之间的间隔为10个像素 FlowLayout fl = new FlowLayout(FlowLayout.CENTER,10,10); //实例化流式布局类的对象 frame.setLayout(fl); //实例化JLabel标签对象,该对象显示“账号” JLabel labname = new JLabel("账号:"); labname.setFont(new Font("宋体",Font.PLAIN,14)); //将labname标签添加到窗体上 frame.add(labname); //实例化JTextField标签对象化 JTextField text_name = new JTextField(); Dimension dim1 = new Dimension(300,30); text_name.setPreferredSize(dim1);//设置除顶级容器组件以外其他组件的大小 //将textName标签添加到窗体上 frame.add(text_name); //实例化JLabel标签对象,该对象显示“密码” JLabel labpass = new JLabel("密码:"); labpass.setFont(new Font("宋体",Font.PLAIN,14)); //将labpass添加到窗体上 frame.add(labpass); //实例化JPasswordField JPasswordField text_password = new JPasswordField(); //设置大小 text_password.setPreferredSize(dim1); //添加到窗体 frame.add(text_password); //实例化JButton组件 JButton button1 = new JButton(); //设置按键的显示内容 Dimension dim2 = new Dimension(100,30); button1.setText("登录"); button1.setFont(new Font("宋体",Font.PLAIN,14)); //设置按键大小 button1.setSize(dim2); frame.add(button1); frame.setVisible(true);//窗体可见,一定要放在所有组件加入窗体后 LoginListener ll = new LoginListener(frame,text_name,text_password); button1.addActionListener(ll); } }
监视器LoginListener.java
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.Font; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; public class LoginListener implements ActionListener{ private javax.swing.JTextField text_name; private javax.swing.JPasswordField text_password; private javax.swing.JFrame login; public LoginListener(javax.swing.JFrame login,javax.swing.JTextField text_name,javax.swing.JPasswordField text_password) {//获取登录界面、账号密码输入框对象 this.login=login; this.text_name=text_name; this.text_password=text_password; } int i=3;//3次登录机会 public void actionPerformed(ActionEvent e) { Dimension dim2 = new Dimension(100,30); Dimension dim3 = new Dimension(300,30); //生成新界面 javax.swing.JFrame login2 = new javax.swing.JFrame(); login2.setSize(400,200); login2.setDefaultCloseOperation(3); login2.setLocationRelativeTo(null); login2.setFont(new Font("宋体",Font.PLAIN,14)); //宋体,正常风格,14号字体 //创建组件 javax.swing.JPanel jp1 = new JPanel(); javax.swing.JPanel jp2 = new JPanel(); if(text_name.getText().equals("ya") && text_password.getText().equals("123456")) { login2.setResizable(false); new Win(); login.dispose(); } else if(i>=2) { JLabel message = new JLabel("账号或密码错误,您今天还有"+(i-1)+"次机会"); message.setFont(new Font("宋体",Font.PLAIN,14)); //宋体,正常风格,14号字体 message.setPreferredSize(dim3); //将textName标签添加到窗体上 jp1.add(message); login2.add(jp1,BorderLayout.CENTER); JButton close = new JButton("确定"); close.setFont(new Font("宋体",Font.PLAIN,14)); //设置按键大小 close.setSize(dim3); jp2.add(close); login2.add(jp2,BorderLayout.SOUTH); i--;//次数减少 close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { login2.dispose(); } }); login2.setResizable(false); login2.setVisible(true); } else if(i == 1) { JLabel message = new JLabel("账号已锁定,请明天再试"); message.setFont(new Font("宋体",Font.PLAIN,14)); //宋体,正常风格,14号字体 message.setPreferredSize(dim3); //将textName标签添加到窗体上 jp1.add(message); login2.add(jp1,BorderLayout.CENTER); JButton close = new JButton("确定"); close.setFont(new Font("宋体",Font.PLAIN,14)); //设置按键大小 close.setSize(dim3); jp2.add(close); login2.add(jp2,BorderLayout.SOUTH); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { login2.dispose(); } }); login2.setResizable(false); login2.setVisible(true); //通过我们获取的登录界面对象,用dispose方法关闭它 login.dispose(); } } private void setVisible(boolean b) { // TODO Auto-generated method stub } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?