用 java 写一个计算器

来源:互联网 发布:面试软件项目介绍 编辑:程序博客网 时间:2024/05/16 18:47
一.  计算器图形界面:

由组件构成,例如Button,TextField等,特殊组件:容器,容器是组件的容器,各种组件包括容器可以通过add方法添加到容器中。显示在屏幕上的所有组件都包含在某个容器中。Swing提供了4种容器,JFrame,JApplet,JDialog,JWindow。JFrame是一个带有标题和控制按钮的独立窗口(最大最小化),JApplet被包含在浏览器窗口中。JDialog用于对话框,JWindow是一个不带有标题行和控制按钮的,所以用的很少。所以用JFrame作为容器。

二. 思路:用JFrame 作为容器,分两个面板JPanel,上面作显示部分放置JTextArea(设置为不可编辑,做显示用),下面放置各种按钮。
import java.awt.Container;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.LayoutManager;import java.awt.event.ActionListener;import javax.swing.*;public class Mycomputer extends JFrame{public Mycomputer() {super("Calculator");JPanel resultField = new JPanel();JPanel buttonField = new JPanel();JTextArea displayresultArea = new JTextArea("      ",1,10);JButton[] buttons=new JButton[16];JButton clear = new JButton("C");Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);clear.setFont(font);displayresultArea.setFont(font);resultField.add(clear);resultField.add(displayresultArea);displayresultArea.setEditable(false);buttonField.setLayout(new GridLayout(4,4,3,3));String[] buttonnameStrings =  {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);buttonField.add(buttons[i*4+j]);}}Container jframeContainer = this.getContentPane();jframeContainer.setLayout(new FlowLayout());jframeContainer.add(resultField);jframeContainer.add(buttonField);setVisible(true);//setResizable(true);}public static void main(String[] args) {Mycomputer mc= new Mycomputer();mc.pack();}}
布局前要用,获得ContentPane, 最有要setVisible(ture);可以.pack使格局紧凑。
Container jframeContainer = this.getContentPane();
三.JAVA 定义了很多事件类(event),如鼠标事件MouseEvent类,和代表键盘事件的KeyEvent类。当用户在组件上进行某种操作时候,事件处理系统便会生成一个事件类对象。

这个计算器,主要是鼠标单击按钮,事件处理系统生成一个代表此事件的ActionEvent事件类对象,操作不同,事件类对象不同。ActionEvent 这个接口只有一个方法,actionPerformed(),当出现ActionEvent事件的时候,该方法就会被调用。为了被接受并处理类事件,组件必须注册相应的时间处理程序,即时间的监听程序。处理计算器上的按钮的ActionEvent事件,需要为按钮JButton注册ActionEvent事件监听程序,每个组件都有如addXXXListener的方法。。

先定义一个实现了接口ActionListener的继承JFrame的类:

public class Mycomputer extends JFrame implements ActionListener{...};

再定义按钮:

JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
JButton clear = new JButton("C");//定义一个删除键

再对按钮注册事件监听程序:

clear.addActionListener(this);

buttons[i*4+j].addActionListener(this);

定义这样的方法,这样点击按钮就可以实现接口里的方法actionPerformed:

public void actionPerformed(ActionEvent e)

PS:对于按钮数组,可以用判断事件源 可以用 Object source=e.getSource();//判断事件源,并进行相应的处理;

四.其他细节:

1.'*',char 型用单引号;

2.return 可以只能跳出当前方法,不能中断程序;所以用红色的方法不能中断程序。break:用来跳出循环for, switch,if

<span style="background-color: rgb(255, 102, 102);">public void judgezero(double second2){if (second2 == 0){init();displayresultArea.setText("can't be 0");return;}}</span>
<pre name="code" class="java"><span style="color:#330033;background-color: rgb(255, 102, 102);">case '/':judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! second = first / second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;</span>

改成:

<span style="white-space:pre"></span>public boolean judgezero(double second2)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>if (second2 == 0)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>init();<span style="white-space:pre"></span>displayresultArea.setText("can't be 0");<span style="white-space:pre"></span>return true;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else {<span style="white-space:pre"></span>return false;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
case '/'://<span style="color:#ff6666;">judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! </span>if (judgezero(second)) {return;}second = first / second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;
3.把text里显示的数字转换成可计算的数据;把计算的数据显示在TEXT上

second=Double.parseDouble(displayresultArea.getText());
displayresultArea.setText(String.valueOf(second));


五.没完成 . 和 JFrame 外观 的问题。

代码:
import java.awt.Container;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.LayoutManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import com.sun.xml.internal.ws.api.server.SDDocument;public class Mycomputer extends JFrame implements ActionListener{//implements 实现接口,interface 接口JPanel resultField = new JPanel(); //面板,用来放显示结果的text 和 删除键JPanel buttonField = new JPanel();//面板,放数字键,符号键JTextArea displayresultArea = new JTextArea("",1,10);//用来显示计算结果JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点JButton clear = new JButton("C");//定义一个删除键Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);// Font 类表示字体,可以使用它以可见方式呈现文本boolean preisNum = false, preisSign = false;//判断上一次按的是数字或者是符号 double  first=0, second = 0;//first 存储上一个数字,second储存当前text显示的数字char sign1 = '\0',sign2='\0';//sign1 储存上一个符号,second储存当前按的符号public Mycomputer() {super("Calculator");clear.addActionListener(this);clear.setFont(font);displayresultArea.setFont(font);resultField.add(clear);resultField.add(displayresultArea);displayresultArea.setEditable(false);buttonField.setLayout(new GridLayout(4,4,3,3));String[] buttonnameStrings =  {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);buttonField.add(buttons[i*4+j]);buttons[i*4+j].addActionListener(this);}}Container jframeContainer = this.getContentPane();jframeContainer.setLayout(new FlowLayout());jframeContainer.add(resultField);jframeContainer.add(buttonField);setVisible(true);setResizable(true);}public void init(){first=0;second = 0;sign1 = '\0';sign2='\0';displayresultArea.setText("");preisNum = false;preisSign = false;}public void actionPerformed(ActionEvent e){Object source=e.getSource();//判断事件源,并进行相应的处理if (source ==clear) {init();}if (source==buttons[0]) {//showNumber("7");pressNumber("7");}if (source==buttons[1]) {pressNumber("8");}if (source==buttons[2]) {pressNumber("9");}if (source==buttons[3]) {preisNum = false;if (preisSign) {return;}preisSign =true;second=Double.parseDouble(displayresultArea.getText());sign2='+';if (sign1=='\0') {sign1='+';first=second;return;}else {switchsign1();}}if (source==buttons[4]) {pressNumber("4");}if (source==buttons[5]) {pressNumber("5");}if (source==buttons[6]) {pressNumber("6");}if (source==buttons[7]) {preisNum = false;if (preisSign) {return;}preisSign =true;second=Double.parseDouble(displayresultArea.getText());sign2='-';if (sign1=='\0') {sign1='-';first=second;return;}else {switchsign1();}}if (source==buttons[8]) {pressNumber("1");}if (source==buttons[9]) {pressNumber("2");}if (source==buttons[10]) {pressNumber("3");}if (source==buttons[11]) {preisNum = false;if (preisSign) {return;}preisSign =true;second=Double.parseDouble(displayresultArea.getText());sign2='*';if (sign1=='\0') {sign1='*';first=second;return;}else {switchsign1();}}if (source==buttons[12]) {pressNumber("0");}if (source==buttons[13]) {}if (source==buttons[14]) {preisNum = false;preisSign = false;second=Double.parseDouble(displayresultArea.getText());if (sign1=='\0') {first=second;return;}else {switchsign1();}}if (source==buttons[15]) {preisNum = false;if (preisSign) {return;}preisSign =true;second=Double.parseDouble(displayresultArea.getText());sign2='/';if (sign1=='\0') {sign1='/';first=second;return;}else {switchsign1();}}}public void pressNumber(String n){if (preisNum) {displayresultArea.append(n);}else {displayresultArea.setText(n);}preisNum = true;preisSign = false;}public boolean judgezero(double second2){if (second2 == 0){init();displayresultArea.setText("can't be 0");return true;}else {return false;}}public void switchsign1(){switch (sign1) {case '+':second = first + second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;case '-':second = first - second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;case '*':second = first * second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;case '/'://judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! if (judgezero(second)) {return;}second = first / second;displayresultArea.setText(String.valueOf(second));sign1=sign2;first = second;break;default:break;}}public static void main(String[] args) {Mycomputer mc= new Mycomputer();mc.pack();}}

0 0
原创粉丝点击