实验名称: 基本面向对象编程-计算机基本功能实现_
通过综合实践项目,理解Java 程序设计是如何体现面向对象编程基本思想,掌握OOP方法,掌握事件触发、消息响应机制。进一步巩固面向对象编程基本知识和技能,为C/S模式项目开发打下基础。
1.实验题目
运用GUI技术,事件触发、消息响应机制,实现一个完整综合设计项目“模拟基本的计算机程序”的设计开发开发。
2.实验要求
(1)客户体验
以组为单位,分别体验不同计算机类型的计算流程以及计算的结果展现方式,根据体验结果,总结体验感受,并根据个人用户需求,提出更人性化、功能更完善的系统,使得实验项目更接近实战,让学生理解一切项目都来源于应用,归于用户体验和使用。
计算器的运行页面
源代码如下:
package cacu;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Mycacu extends JFrame{
JTextField tfResult;
//输入结果显示框
JButton btNum[],btOper[],btEqual,btPoint;//设计输入按钮分为四种数字按钮,加减乘除操作按钮,等于号按钮, 小数点按钮.
boolean isNum,isOper;//设计两个布尔型变量
double firstNum,secondNum;//定义两个双精度的变量
String operStr;
public void init(){
//定义各个功能输入按钮的内容
tfResult=new JTextField();
btNum=new JButton[10];
for(int i=0;i<=9;i++)
btNum[i]=new JButton(i+"");
btOper=new JButton[4];
btOper[0]=new JButton("+");
btOper[1]=new JButton("-");
btOper[2]=new JButton("*");
btOper[3]=new JButton("/");
btEqual=new JButton("=");
btPoint=new JButton(".");
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(4,4));//创建流失布局依次部署按钮
panel.add(btNum[1]);
panel.add(btNum[2]);
panel.add(btNum[3]);
panel.add(btOper[0]);
panel.add(btNum[4]);
panel.add(btNum[5]);
panel.add(btNum[6]);
panel.add(btOper[1]);
panel.add(btNum[7]);
panel.add(btNum[8]);
panel.add(btNum[9]);
panel.add(btOper[2]);
panel.add(btPoint);
panel.add(btNum[0]);
panel.add(btEqual);
panel.add(btOper[3]);
//设计窗体的显示功能
this.add(tfResult,"North");
this.add(panel);
this.setFont(new Font("宋体",Font.BOLD,18));
this.setTitle("浩宇牌计算器");
this.setSize(400,400);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗体居中显示
// 得到显示器屏幕的宽、高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 得到窗体的宽、高
int windowsWidth = this.getWidth();
int windowsHeight = this.getHeight();
this.setBounds((width - windowsWidth) / 2,(height - windowsHeight) / 2, windowsWidth, windowsHeight);
//注册监听
MyActLis mal=new MyActLis();
for(int i=0;i<=9;i++){
btNum[i].addActionListener(mal);
}
for(int i=0;i<4;i++){
btOper[i].addActionListener(mal);
}
btEqual.addActionListener(mal);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Mycacu().init();
}
//监听器类设计
class MyActLis implements ActionListener{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String s=e.getActionCommand();
if(s.equals("0")||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
isOper=false;
if(isNum==false){
isNum=true;
tfResult.setText(s);
}else{
tfResult.setText(tfResult.getText()+s);
}
}
else if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
isOper=true;
isNum=false;
firstNum=Double.parseDouble(tfResult.getText());
operStr=s;
}
else if(s.equals("=")){
isNum=false;
isOper=false;
if(operStr.equals("+")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum+secondNum+"");
}
else if(operStr.equals("-")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum-secondNum+"");
}
else if(operStr.equals("*")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum*secondNum+"");
}
else if(operStr.equals("/")){
if(firstNum==0){
JOptionPane.showMessageDialog(Mycacu.this, "输入错误,除数不为0!");
//优化1:数学规则除数不为0,当除数为0的时候弹出 框体提示
}
else if(secondNum==0) {
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(secondNum+"");
//优化2:当除数为0 的时候系统输出结果为0,而不是计算机当中的infinite了
}
else {
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum/secondNum+"");
}
}
else if(1>0){
firstNum=Double.parseDouble(tfResult.getText());
//取出第一个输入的数字,并以文本的方式来展现出来。
tfResult.setText(firstNum+"");
}
四、实验中的问题以及解决方案
问题:在实际的计算过程中出现了,被除数为0,计算结果出错的情况。不符合实际的数学定理以及实际的应用的过程。
解决措施:利用else-if语句对其进行了多条的验证,判断第一个数字是否为0,要是为0,则弹出提示框,提示被除数不为0,达到了预期的效果;
解决后的运行结果截图:
2、问题:当只点击一个数字的时候,就点击等于号程序会在展示页面,没有反应,出现上图的类似的状况。
解决:也是借用else-if语句,设置了一个我自己认为的永真条件,只输出和展示一个数字的结果
解决代码截图:
3、问题:当出现一个不为零的数除以0的时候运算结果不清楚,与实际的数学意义上的结果存在差异
解决:当进行除数运算的时候判断第二个数是否为0,要是为0则输出设定好的答案。
4.问题:当你只输入一个数字并点击运算符号,而不输入第二个数字的时候它会将当前的数字当为第二个数字
解决:正在解决当中ing~~~~~
通过此次的cs项目的编程试验,使我进一步了解和体会了事件响应机制的原理,自己在实际的编程过程中对于Java的基本知识,也有了更为深入的理解。对于功能不同的按键的归纳总结有了更为深入的了解,通过功能输入键的相同可以减少所编写的代码量,减少工作量,通过此次的实际编程对于java的基本知识,和实际的操作流程。