- 相关推荐
java计算器综合实例学习教程
下面是百分网小编带来的Java计算器综合实例学习教程,欢迎学习!

本节给出了一个计算器的综合实例,该实例主要利用了本章及上一章所涉及的SWING组件及组件事件的处理来实现的,在实现的过程中还使用到了异常处理的知识。
[例8-14]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Calculator extends JFrame{
String[] buttons =
new String[]{"7","8","9","/","4","5","6","*","1","2","3","-","0","+/-",".","+"};
JPanel pWest = new JPanel();
JPanel pMain = new JPanel();
JPanel pNorth = new JPanel();
JPanel pMain_North = new JPanel();
JPanel pMain_Center = new JPanel();
JPanel pMain_East = new JPanel();
JButton buttonMain[];//包括数字0-9以及'+','-','*','+'/'.','+/-'
JButton buttonNorth[];//包括Back,CE,C
JButton buttonEast[];//包括sqrt,%,1/x,=
JTextField fieldResult = new JTextField();
//
static private String value1="";//第一个操作数
static private String value2="";//第二个操作数
static private String oper="";//操作符
static private String result="";//运算结果
static private String lastChar="";//相比当前,其上一个按下按钮的字符
static private boolean value1Input=true;//处于第一个操作数输入情况
static private boolean value2Input=false;//出于第二个操作数输入情况
static private boolean start = false;//是否开始计算,主要是用于检测刚开始时按下非数字键的情况。
public Calculator(String title){
super(title);
Container contentPane = this.getContentPane();
fieldResult.setHorizontalAlignment(JTextField.RIGHT);//右对齐
pMain_Center.setLayout(new GridLayout(4,4,5,5));
buttonMain= new JButton[buttons.length];
for(int i=0;i
buttonMain[i] = new JButton(buttons[i]);
pMain_Center.add(buttonMain[i]);
}
buttonNorth = new JButton[3];
buttonNorth[0] = new JButton("Back");
buttonNorth[1] = new JButton("CE");
buttonNorth[2] = new JButton("C");
pMain_North.setLayout(new GridLayout(1,3,5,5));
pMain_North.add(buttonNorth[0]);
pMain_North.add(buttonNorth[1]);
pMain_North.add(buttonNorth[2]);
buttonEast = new JButton[4];
buttonEast[0] = new JButton("sqrt");
buttonEast[1] = new JButton("%");
buttonEast[2] = new JButton("1/x");
buttonEast[3] = new JButton("=");
pMain_East.setLayout(new GridLayout(4,1,5,5));
pMain_East.add(buttonEast[0]);
pMain_East.add(buttonEast[1]);
pMain_East.add(buttonEast[2]);
pMain_East.add(buttonEast[3]);
contentPane.add(fieldResult,BorderLayout.NORTH);
pMain.setLayout(new BorderLayout(5,5));
pMain.add(pMain_Center,BorderLayout.WEST);
pMain.add(pMain_East,BorderLayout.EAST);
pMain.add(pMain_North,BorderLayout.NORTH);
contentPane.add(pMain,BorderLayout.CENTER);
pack();
setVisible(true);
//注册监x器
MyActionListener listener = new MyActionListener();
for(int i=0;i
buttonMain[i].addActionListener(listener);
}
buttonNorth[0].addActionListener(listener);//Back
buttonEast[3].addActionListener(listener);//"="
buttonNorth[2].addActionListener(listener);//"C"
buttonMain[13].setEnabled(false);//设置+/-不可用
buttonMain[14].setEnabled(false);//设置.不可用
buttonNorth[1].setEnabled(false);//设置CE不可用
buttonEast[0].setEnabled(false);//设置sqrt不可用
buttonEast[1].setEnabled(false);//设置%不可用
buttonEast[2].setEnabled(false);//设置1/x不可用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private class MyActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
//数字键
if(Character.isDigit(str.charAt(0))){
handalDigit(str);
}
if(start == true){
if(str.equals("=")){//"="键
handalEqual(str);
return;
}
//Back、C键处理,完善本程序时可在下面的语句中添加对其他按钮的处理
if(str.equals("Back")||str.equals("C")){
handalNonOper(str);
}
//'+','-','*','+'/'的处理,完善本程序时可添加sqrt,%等操作符的处理
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
handalOper(str);
}
}
}
//处理数字,str表示按钮上的文字
private void handalDigit(String str){
char currentChar=str.charAt(0);//获得按下的字符;
if(!lastChar.equals("=")){
if(value2Input == false){
value1+=String.valueOf(currentChar);
if(value1.charAt(0)=='0'){//第一个数字为0
value1="0";
}
fieldResult.setText(value1);
}
else{
value2+=String.valueOf(currentChar);
if(value2.charAt(0)=='0'){//第一个数字为0
value2="0";
}
fieldResult.setText(value2);
}
start = true;
lastChar = str;
}
else{//是=
resetAllValue();
value1+=str;
fieldResult.setText(value1);
}
printAllValue();
}
//处理"="键
private void handalEqual(String str){
if(Character.isDigit(lastChar.charAt(0)) && value2.length()>0){
handalOper(str);
}
}
//处理运算符,暂时只处理+,-,*,/str表示按钮上的文字
private void handalOper(String str){
if(start == true){
if(value1.length()>0 && value2.length()>0){
result=operationResult(value1,value2,oper.charAt(0));
fieldResult.setText(result);
if(!result.equals("除数不能为零")){
value1=result;
value2="";
}
}
else{//说明第一个操作数输入结束,操作符结束,开始输入第二个操作数
value1Input=false;
value2Input=true;
}
oper = str;//记录操作符
lastChar = str;//记录最后一个字符
printAllValue();
}
}
//处理非运算符,但不是数字,如Back,C等键,str表示按钮上的文字
private void handalNonOper(String str){
if(str.equals("Back")){//Back键处理
if(Character.isDigit(lastChar.charAt(0)) == true){//必须是前一个字符是数字
if(value2Input == true){
if(value2.length()>0){
value2 = value2.substring(0,value2.length()-1);
}
fieldResult.setText(value2);
}
else{
if(value1.length()>0){
value1 = value1.substring(0,value1.length()-1);
}
else{
resetAllValue();
}
fieldResult.setText(value1);
}
}
printAllValue();
}
if(str.equals("C")){//C键处理
resetAllValue();
fieldResult.setText("");
printAllValue();
}
}
//对两个字符串value1和value2表示的整数做运算,oper表示运算符
private String operationResult(String value1,String value2,char oper){
String result;
try{
switch(oper){
case '+':
result = String.valueOf(Integer.parseInt(value1)+Integer.parseInt(value2));
break;
case '-':
result = String.valueOf(Integer.parseInt(value1)-Integer.parseInt(value2));
break;
case '*':
result = String.valueOf(Integer.parseInt(value1)*Integer.parseInt(value2));
break;
case '/':
if(value2.equals("0")){
result="除数不能为零";
resetAllValue();//所有值置初值
}
else{
result = String.valueOf(Integer.parseInt(value1)/Integer.parseInt(value2));
}
break;
default:
result="error";
}
}
catch(Exception ex){
result = "操作数或结果超过整数范围";
resetAllValue();
}
return result;
}
//重置变量值
private void resetAllValue(){
value1="";//第一个操作数
value2="";//第二个操作数
oper="";//操作符
result="";//运算结果
lastChar="";//相比当前,其上一个按下按钮的字符
value1Input=true;//处于第一个操作数输入情况
value2Input=false;//出于第二个操作数输入情况
start = false;
}
//打印变量值
private void printAllValue(){
System.out.println("| --------Values display----------------");
System.out.println("| value1:" + value1);
System.out.println("| value2:" + value2);
System.out.println("| oper:" + oper);
System.out.println("| result:" + result);
System.out.println("| lastChar:" + lastChar);
System.out.println("| value1Input:" + value1Input);
System.out.println("| value2Input:" + value2Input);
System.out.println("| start:" + start);
System.out.println("| --------------------------------------");
}
}
}
public class Calculator{
public static void main(String[] args) {
new Calculator("计算器");
}
}
程序运行主界面如下:
图8-18 计算器程序运行主界面
该程序实现了加减乘除运算,且充分考虑了各种异常情况,一般不会出现在按下某个按键时出现程序报异常的错误,对于程序中未实现的按钮功能,运行界面中都以灰色按钮的形式出现,读者可在研究本程序的基础上完成这些按键的功能。
【java计算器综合实例学习教程】相关文章:
Java的特点学习教程08-27
Java中的== 和equals()方法详解与实例教程08-03
Java数组的基础学习教程08-12
Java数组的基本学习教程08-22
Java对话框学习教程05-31
java编译计算器08-11
python概率计算器实例分析11-11
Axure交互实例教程07-19
java教程之Java编程基础09-12