我的第一个JAVA程序之计算器
这是我的第一篇博客!为什么想写博客呢?以前我也经常写一些东西在有道云笔记,但是有道云笔记不能同大家共享,博客写出来以后除了给大家共享之外,还能同大家交流。我是一个学生,我写的可能有很多的错误,但我将它写出来与大家分享,也希望大家给我一点建议!
大三刚开始学习Java,以前学过C#和ASP.net。刚开始学习JAVA,不太习惯,但是JAVA有他自己的优势。学到后面也就熟悉了他的编程特点。第一个JAVA窗口程序老师就让我们仿照Windows自带的计算器编写一个计算器程序。其实以前用C#编写过一个计算器程序,当时界面模仿的很像,但是功能只有简单地加减乘除计算。这一次的计算器可没有当时那么简单,当时可以在Visual Studio里面拖控件,但这次我全部是在eclipse里面写的代码,这也是一种很好的锻炼吧。废话不说了,开始讲我的第一个程序的编写过程和自己的一些想法,希望大家多给一点建议!
一、仿照做一个计算器界面
计算器可谓是我们再熟悉不过的了,这是Windows自带的计算器界面。
首先,我将这个计算器的界面分为三部分,第一部分最上面的菜单栏部分,然后是接下来的文本区域部分,最后是按钮部分。确定了这三个部分,就能开始设计界面了。先在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自带的计算器将一个界面弄了出来,写的代码有点多,但是自己感觉整体思路还比较清晰,大家有另外的好的想法可以交流一下。做出来的整体效果如图:这里的菜单我只是添加了,没有任何作用。
二、添加事件
做完了界面然后开始给每个按钮添加事件,这里我新建了一个类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,你在写之前可以先做一些整个算法的流程图,这样会帮助你更全面的编写代码。
以下是我的计算器的一些截图,
这个项目文件:
代码截图:
这个计算器的作业就到这里,这是我的第一个JAVA程序,也是第一篇博客,大三学生、热爱编程者一枚请大家多多支持,要是有什么疑问或者观点,可以同我交流(QQ:1364887879 ;E-mail: xq_cxd@126.com):,如果您要转载此篇文章,我不胜荣幸,请说明转载出处!谢谢大家~