java计算器流程图_我的第一个JAVA程序之计算器

这是我的第一篇博客!为什么想写博客呢?以前我也经常写一些东西在有道云笔记,但是有道云笔记不能同大家共享,博客写出来以后除了给大家共享之外,还能同大家交流。我是一个学生,我写的可能有很多的错误,但我将它写出来与大家分享,也希望大家给我一点建议!

大三刚开始学习Java,以前学过C#和ASP.net。刚开始学习JAVA,不太习惯,但是JAVA有他自己的优势。学到后面也就熟悉了他的编程特点。第一个JAVA窗口程序老师就让我们仿照Windows自带的计算器编写一个计算器程序。其实以前用C#编写过一个计算器程序,当时界面模仿的很像,但是功能只有简单地加减乘除计算。这一次的计算器可没有当时那么简单,当时可以在Visual Studio里面拖控件,但这次我全部是在eclipse里面写的代码,这也是一种很好的锻炼吧。废话不说了,开始讲我的第一个程序的编写过程和自己的一些想法,希望大家多给一点建议!

一、仿照做一个计算器界面

计算器可谓是我们再熟悉不过的了,这是Windows自带的计算器界面。

06cb3f08bbe652b30cc9c695946ce309.png

首先,我将这个计算器的界面分为三部分,第一部分最上面的菜单栏部分,然后是接下来的文本区域部分,最后是按钮部分。确定了这三个部分,就能开始设计界面了。先在eclipse里面建好一个项目。然后新建类。一个主类onemain,再建一个继承与JFrame的WindowCalculator类。主类里面很简单,只是实例化了WindowCalculator类,设置了标题和边框,主要代码如下:WindowCalculator win=new WindowCalculator();

win.setTitle("计算器");

win.setBounds(600,260,233,328);这里我设置的窗口大小是根据Windows自带的计算器大小,怎么获取大小,你可以按Print

Screen截屏再用Photoshop看大小,我这里介绍一种简单有效的方法,就是用QQ自带的截屏功能,同时按住 Ctrl+Alt+A ,鼠标指到计算器它会显示大小。然后是再新建一个WindowCalculator类。在这里首先定义菜单、文本框、所有按钮和一个panel面板。这里我将所有的按钮都定义了,代码有点繁琐,其实可以用数组和for循环来定义,但想到如果以后布局和添加键盘事件等,还是每个都定义直观一点。主要代码如下:

JMenuBar menubar;

JMenu lookMenu,editMenu,helpMenu;

JMenuItem lookItem1,lookItem2,lookItem3,editMenu1,editMenu2,helpMenu1,helpMenu2;

JTextField text;

JPanel topPanel;

//{加:btnAdd}、{减:btnSub}、{乘:btnMul}、{除:btnDiv}、{等于:btnEqu}、{小数点:btnDon}、{撤销:btnBack}、{清除所有:btnC}、{清除当前:btnCE}、{正负号:btnSorM}、{根号:btnRoot}、{百分比:btnPer}、{x分之一:btnX1}

JButton btnMC,btnMR,btnMS,btnMadd,btnMSub,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btnAdd,btnSub,btnMul,btnDiv,btnDon,btnEqu,btnBack,btnCE,btnC,btnSorM,btnRoot,btnPer,btnX1;然后在WindowCalculator类的构造方法里面调用方法init()和设置窗口不能改变大小等,代码如下:

WindowCalculator(){

init();

setVisible(true);

setResizable(false);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}在init()方法里面进行详细的布局,先是添加菜单,接着添加文本框,再添加按钮。为了布局的好看和方便,布局采用空布局,这样我们能够控制每个控件的大小和方位,所有按钮都添加到Panel面板里面,panel面板的布局也是空布局。这里举例查看菜单的添加方法别的和这个类似,代码如下:

menubar=new JMenuBar();

lookMenu=new JMenu("查看(V)");

/*查看菜单*/

lookItem1=new JMenuItem("标准型(T)");

lookItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,InputEvent.ALT_MASK));

lookItem2=new JMenuItem("科学型(S)");

lookItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2,InputEvent.ALT_MASK));

lookItem3=new JMenuItem("退出(E)");

lookItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));

/*添加菜单*/

lookMenu.add(lookItem1);

lookMenu.add(lookItem2);

lookMenu.addSeparator();//添加分隔符

lookMenu.add(lookItem3);

menubar.add(lookMenu);

setJMenuBar(menubar);接着设置文本框,设置大小、文本右对齐等等,代码如下:

/**********************文本框**************************/

text=new JTextField(18);

text.setBounds(3, 3, 220, 50);

text.setHorizontalAlignment(JTextField.RIGHT);//文本右对齐

text.setText("0");//第一次显示0

text.setEditable(false);//禁止键盘输入

text.setBackground(Color.white);

computer.setJTextField(text);

add(text);然后就是设置每个按钮的大小和方位,然后添加到panel面板,设置panel面板的大小和布局。这里举一个例子,别的按钮类似。代码如下:

btnMC=new JButton("MC");

btnMC.setBounds(0, 0, 34, 27);

btnMC.setMargin(new Insets(0,0,0,0));//设置按钮的margin为0

topPanel.add(btnMC);

add(topPanel);

topPanel.setBounds(11, 60, 220, 260);

topPanel.setLayout(null);这样,就完全模仿Windows自带的计算器将一个界面弄了出来,写的代码有点多,但是自己感觉整体思路还比较清晰,大家有另外的好的想法可以交流一下。做出来的整体效果如图:

becdcf4dc4a27b8a132be092b2cd547c.png

这里的菜单我只是添加了,没有任何作用。

二、添加事件

做完了界面然后开始给每个按钮添加事件,这里我新建了一个类ComputerListener,ComputerListener类实现接口ActionListener。因为这里的事件涉及到了按钮和文本框,所以要返回WindowCalculator类给文本框和每个按钮添加监听器。这里不做过多解释。添加完了监听器之后返回ComputerListener类写事件。代码如下:

public class ComputerListener implements ActionListener{

JButton button;

JTextField text;

ComputeController control=new ComputeController();

public void setJTextField(JTextField t){

text=t;

}

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

try{

control.BtnClick(e.getActionCommand());

text.setText(control.showNewNum());

//JOptionPane.showMessageDialog(text, text.getText());//(text, text.getText(), JOptionPane.WARNING_MESSAGE);

//text.setText(e.getActionCommand());

}

catch(Exception exp){

text.setText("出现未知错误!");

}

}

}这里先提一下ComputeController类,这是一个控制计算的类,下面我会具体讲。首先看按钮点击的事件方法actionPerformed,control.BtnClick这个方法是ComputeController类里面的,e.getActionCommand()返回的是点击按钮上面的字符。text.setText是控制JTextField文本框的显示。

三、控制计算类ComputeController

做完了计算器的界面和添加了事件,这里专门又新建了一个类用来控制计算。首先要定义以下变量,当然以后可能还要定义别的变量,代码如下:

String strOld=null,strSign=null,strShow="0";//strOld是上一次的数据;strShow是显示的字符串;strSign是符号

boolean isClickSign=false;//这里是判断上一个点击的是不是符号这几个变量里面我strOld是记录上一次输入的数据,strSign是记录你输入的运算符号,strShow是当前显示的内容,默认为0,布尔变量isClickSign是确定你上一次点击的是不是运算符号(PS:当你先输入数字点击运算符号是,你输入的字符还在显示,但是接着输入数字时会消失)。然后我们定义一个方法BtnClick,这个方法就是在ComputerListener类里面调用的方法,代码如下:

/****************此方法根据哪个按钮被触发并执行相应的方法****************/

public void BtnClick(String btnLable){

if(btnLable=="0"||btnLable=="1"||btnLable=="2"||btnLable=="3"||btnLable=="4"||btnLable=="5"||btnLable=="6"||btnLable=="7"||btnLable=="8"||btnLable=="9"){

strShow=ShowNumOfOldNum(strShow,btnLable);

}

if(btnLable=="="){

NumberEqu();

}

if(btnLable=="C"){

NumberC();

}

if(btnLable=="CE"){

NumberCE();

}

if(btnLable=="←"){

NumberBack();

}

if(btnLable=="±"){}

if(btnLable=="√"){}

if(btnLable=="."){

NumberDon();

}

if(btnLable=="+"){

NumberAdd();

}

if(btnLable=="-"){

NumberSub();

}

if(btnLable=="*"){

NumberMul();

}

if(btnLable=="/"){

NumberDiv();

}

}这个方法是通过传过来的参数btnLable获取你当时点击的是哪个按钮,然后根据不同的按钮来调用不同的方法!然后定义了一个showNewNum()方法,这个方法也是在ComputerListener类里面调用的方法,代码如下:

/*显示数据*/

public String showNewNum()

{

return strShow;

}这个方法很简单,就是输出字符串strShow。

不知道讲到这里大家有没有懂。我是运用了MVC框架来设计整个的计算器,关于整个计算器,我将他的视图和计算部分分开,这样有一个好处就是我以后修改程序只需在控制类ComputeController里面修改代码和算法,当你要添加哪个功能,比如求根运算,只需写一个方法,添加到BtnClick里面即可。接下来我列举控制类里面的个别方法,代码如下:

/**********运算的计算与判断*********/

public void CalculateToString(){

double dou;

double douOld=StringToDouble(strOld);

double douShow=StringToDouble(strShow);

if(strSign=="+"){

dou=douOld+douShow;

strShow=DoubleToString(dou);

strOld=strShow;

}

if(strSign=="-"){

dou=douOld-douShow;

strShow=DoubleToString(dou);

strOld=strShow;

}

if(strSign=="*"){

dou=douOld*douShow;

strShow=DoubleToString(dou);

strOld=strShow;

}

if(strSign=="/"){

dou=douOld/douShow;

strShow=DoubleToString(dou);

strOld=strShow;

}

}

/************这里是字符串与Double类型的转换*************/

public String DoubleToString(Double dou){

try{

String s=dou.toString();

return s;

}

catch(Exception e){

return "请检查你的输入";

}

}

public double StringToDouble(String s){

try{

double dou=Double.parseDouble(s.trim());

return dou;

}

catch(Exception e){

return 0;

}

}

/*加法计算*/

public void NumberAdd(){

if(strSign==null&&strOld==null){

strSign="+";

strOld=strShow;

isClickSign=true;

}

else if(strSign!=null&&strOld!=null){

CalculateToString();

isClickSign=true;

}

}

/*小数点*/

public void NumberDon(){

if(strShow.contains(".")){

return;

}

if(isClickSign==true)

{

isClickSign=false;

strShow="0.";

}

else{

strShow=strShow+".";

}

}

/*全部清除归零*/

public void NumberC(){

strOld=null;

strSign=null;

strShow="0";

}

/*清除当前*/

public void NumberCE(){

strShow="0";

}

/*撤销返回*/

public void NumberBack(){

if(strShow.length()==1||strShow.length()==0){

strShow="0";

}

else{

strShow=strShow.substring(0, strShow.length()-1);

}

}

/*根据原有的显示输出字符*/

public String ShowNumOfOldNum(String OldNum,String InputNum){

if(OldNum=="0"&&InputNum=="0"){

return "0";

}

if(OldNum=="0"){

return InputNum;

}

if(OldNum=="0."){

return "0."+InputNum;

}

if(isClickSign==true)

{

isClickSign=false;

return InputNum;

}

else{

return OldNum+InputNum;

}

}

别的一些方法我这里就不列举了,我写的方法不是完全正确的,运行起来还是有一些问题和BUG,但是只要你能写一个完美的算法,这个计算器一定能达到Windows自带的功能。关于整个算法的流程,我这里推荐Microsoft Visio,你在写之前可以先做一些整个算法的流程图,这样会帮助你更全面的编写代码。

63e18483a4981db2625fffcc3a40d324.png

以下是我的计算器的一些截图,

这个项目文件:

615b483cdfb36604ac20dbd943b0bdb5.png

代码截图:

70527367673707d3377ef64f8404a252.png

这个计算器的作业就到这里,这是我的第一个JAVA程序,也是第一篇博客,大三学生、热爱编程者一枚请大家多多支持,要是有什么疑问或者观点,可以同我交流(QQ:1364887879 ;E-mail: xq_cxd@126.com):,如果您要转载此篇文章,我不胜荣幸,请说明转载出处!谢谢大家~

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值