今天花了一个下午加一个晚上写了个计算器的小程序,用swing写了界面,实现了加、减、乘、除的简单计算,其中小数点花了我一点时间~可能还有bug吧~现在放出源码,仅供交流~望大家找出bug,多多指教!
package com.xijiepc.Calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MyCalculator implements ActionListener{
private JFrame frame;//计算器的框架
private JMenuBar menu;//计算器的菜单栏
private JMenu edit,help;//计算器的菜单按钮
private JMenuItem copy,paste,about;//计算器的下拉子菜单
private JTextField textField;//计算器的输入输出框
private JPanel mainPanel;//主面板
private JPanel funPanel;//功能面板
private JPanel numberPanel;//数字面板
private JButton backSpaceBtn,CBtn,CEBtn;//退格键,清空键,清空缓存
private String[] str={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"};//数字键盘字符
private StringBuffer strBuff;//输入输出框中的缓存字符
private double temp1,temp2;//计算的第一个数和第二个数
private int index;//+ - * /的索引
private double result;//运算的结果
private boolean hasNewNumber=true;//判断是否需要连续运算
public void CrateLayout(){
frame =new JFrame("Calculator");
/*
* 菜单栏
*/
menu =new JMenuBar();
frame.setJMenuBar(menu);
edit=new JMenu(" 编辑(E)");
help=new JMenu(" 帮助(H)");
menu.add(edit);
menu.add(help);
copy=new JMenuItem(" 复制(C)");
paste=new JMenuItem(" 粘贴(P)");
about=new JMenuItem(" 关于(A)");
edit.add(copy);
edit.add(paste);
help.add(about);
strBuff=new StringBuffer();
textField =new JTextField("0",10);//输入输出文本框
textField.setHorizontalAlignment(JTextField.RIGHT); //设置文本框显示字符右对齐
frame.add(textField, BorderLayout.NORTH);//将文本框加入窗体的北方
mainPanel=new JPanel();
frame.add(mainPanel, BorderLayout.CENTER);//将主面板添加到窗体中间
/*
* 功能面板设计
*/
funPanel=new JPanel();
backSpaceBtn=new JButton("BackSpace");//退格键
backSpaceBtn.addActionListener(this);//增加监听器
backSpaceBtn.setForeground(Color.RED);
CBtn=new JButton("C");//清除键
CBtn.addActionListener(this);//增加C的监听器
CBtn.setForeground(Color.RED);
CEBtn=new JButton("CE");//清空缓存
CEBtn.addActionListener(this);//增加CE的监听器
CEBtn.setForeground(Color.RED);
funPanel.add(backSpaceBtn);//将回车键添加到功能面板中
funPanel.add(CBtn);//将清除键添加到功能面板中
funPanel.add(CEBtn);
mainPanel.add(funPanel, BorderLayout.NORTH);//将功能面板排列到主面板的北区
/*
* 数字面板设计
*/
numberPanel=new JPanel();
numberPanel.setLayout(new GridLayout(4,4,8,8));
for(int i=0;i<str.length;i++){
JButton ButtonTemp=new JButton(str[i]);
if(i==3||i==7||i==11||i==13||i==14||i==15){
ButtonTemp.setForeground(Color.RED);
}
numberPanel.add(ButtonTemp);
ButtonTemp.addActionListener(this);
}
mainPanel.add(numberPanel);//在主面板中添加数字面板
frame.pack();
frame.setResizable(false);//禁用最大化按钮
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(220, 270));
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if(s.equals("BackSpace")){//BackSpace功能
try{
if(!textField.getText().trim().equals("0.")){//如果显示屏显示的不是0
if(textField.getText().trim().length()!=1){//如果缓存字符数不为1就将最后一个字符删除
textField.setText(strBuff.delete(strBuff.length()-1, strBuff.length()).toString());
}else{//否则设置初值为0
textField.setText("0.");
strBuff.setLength(0);
}
}
}catch(Exception ex){}
temp2=Double.parseDouble(textField.getText().trim());
hasNewNumber=true;
}else if(s.equals("CE")){//CE清零
textField.setText("0.");
strBuff.setLength(0);
hasNewNumber=true;
}else if(s.equals("C")){//C清零
textField.setText("0.");
strBuff.setLength(0);
temp1=0d;
temp2=0d;
hasNewNumber=true;
}else if(s.equals("+")){//加法运算
temp1=Double.parseDouble(textField.getText().trim());
strBuff.setLength(0);
temp2=0d;
index=0;
hasNewNumber=true;
}else if(s.equals("-")){//减法运算
temp1=Double.parseDouble(textField.getText().trim());
strBuff.setLength(0);
temp2=0d;
index=1;
hasNewNumber=true;
}else if(s.equals("*")){//乘法运算
temp1=Double.parseDouble(textField.getText().trim());
strBuff.setLength(0);
temp2=0d;
index=2;
hasNewNumber=true;
}else if(s.equals("/")){//除法运算
temp1=Double.parseDouble(textField.getText().trim());
strBuff.setLength(0);
temp2=0d;
index=3;
hasNewNumber=true;
}else if(s.equals("=")){
if(hasNewNumber){//如果有新的数就开始新的计算
switch(index){
case 0:
result=temp1+temp2;
if(result-(int)result==0){//如果结果是整数就去掉小数点后的无效0
textField.setText(""+(int)result);
}else{//否则就直接输出
textField.setText(""+result);
}
break;
case 1:
result=temp1-temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
case 2:
result=temp1*temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
case 3:
if(temp2==0){
textField.setText("除数不能为零");
break;
}else{
result=temp1/temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
}
default :
break;
}
hasNewNumber=false;
}else{//连续点击等号就继续计算
switch(index){
case 0:
result+=temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
case 1:
result-=temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
case 2:
result*=temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
case 3:
if(temp2==0){
textField.setText("除数不能为零");
break;
}else{
result/=temp2;
if(result-(int)result==0){
textField.setText(""+(int)result);
}else{
textField.setText(""+result);
}
break;
}
default :
break;
}
}
strBuff.setLength(0);//当重新输入数字时清除以前的
}else if(s.equals(".")){//小数点运算
if(textField.getText().trim().equals("0.")){
strBuff.setLength(0);
textField.setText(strBuff.append("0.").toString());
}else if(textField.getText().trim().equals("0")){
strBuff.setLength(0);
textField.setText(strBuff.append("0.").toString());
}else
textField.setText(strBuff.append(s).toString());
temp2=0d;
hasNewNumber=true;
}else{//其他按键的情况
textField.setText(strBuff.append(s).toString());
temp2=Double.parseDouble(textField.getText().trim());
hasNewNumber=true;
}
}
public static void main(String[] args) {
MyCalculator calculator=new MyCalculator();
calculator.CrateLayout();
}
}
计算器的界面