前言
学习了 JAVA 的 Swing 编程,不由得兴趣做了一个计算器,其中也参考了网上的一些例子,再加上自己的一些想法,花了大概半天的时间总算做出来了,总体来说,写计算器的逻辑还是让人受益匪浅的。
由于在代码中我大部分做了注释,在这里就不多说了
package calcutor;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
/**
* 计算器
* @author Mr.W
* @version 1.0
*/
//声明:没有按到等于号的运算称为连续运算
class CalculatorTest implements ActionListener
{
JFrame f = new JFrame("计算器");
JTextField tf = new JTextField();
Press press = null;
//初始化窗口,构建计算器界面
public void init()
{
JPanel p1 = new JPanel();//此面板放置文本框和清除按钮
Container ct = f.getContentPane();
//文本框的处理
tf.setPreferredSize(new Dimension(195,50));//设置文本框的理想大小
tf.setHorizontalAlignment(JTextField.RIGHT);//设置文本的水平右对齐
p1.add(tf);
//清除按钮
JButton C = new JButton("CE");
C.addActionListener(this);
C.setPreferredSize(new Dimension(69,50));
p1.add(C);
//将画板放置在最上面,北面
ct.add(p1,"North");
JPanel p2 = new JPanel();
ct.add(p2,"Center");
GridLayout c = new GridLayout(5,4); //网格布局
p2.setLayout(c);
//按钮的字符
String[] str ={
"sqrt","^","1/x","+/-",
"1", "2", "3", "+",
"4", "5", "6", "-" ,
"7", "8", "9", "x" ,
".", "0", "=", "/"
};
//循环添加按钮到网格布局的面板中,并设置按钮监听器
for(int i=0 ; i<str.length ; i++){
JButton b = new JButton(str[i]);
p2.add(b);
b.addActionListener(this);
}
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口即关闭程序
f.setSize(290,282);
f.setVisible(true);//窗口可见
}
public CalculatorTest(){
press = new Press(tf);
//其中v只存放四则运算操作,v2是存放所有操作
}
public void actionPerformed(ActionEvent e){
//获取上次的文本框内容,也就是sum的值
String str=tf.getText();
//获得按到的键
String er = e.getActionCommand();
switch (er) {
case "+":
press.Pressplus(str);//加法
break;
case "-":
press.PressCut(str);//减法
break;
case "x":
press.PressMu(str);//乘法
break;
case "/":
press.PressExc(str);//除法
break;
case "=":
press.Pressequal(str);
break;
case "1/x":
press.PressDown(str);
break;
case "^":
press.Presspow(str);
break;
case "sqrt":
press.Presssqrt(str);
break;
case "CE":
press.PressCE();
break;
case "+/-":
press.Pressagain(str);
break;
default:
press.PressNum(er, str);
break;
}
}
public static void main(String args[])
{
try {
//界面风格
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
new CalculatorTest().init();
}
}
package calcutor;
import java.util.Vector;
import javax.swing.JTextField;
public class Press {
private double sum=0;//用于盛放计算结果
private double mark = 0;//盛放幂数
private JTextField tf = null;
private Vector<String> v=new Vector(1,1);//存放运算符操作
private Vector<String> v2=new Vector(1,1);//存放所有操作
public Press(JTextField tf){
this.tf = tf;
v2.addElement(new String("init"));//addElement添加到末尾且自动加1,默认未按键存放init
v.addElement(new String("init"));
}
/*
* 按下等于号
*/
public void Pressequal(String str) {
common(str);
v.addElement(new String("="));
v2.addElement(new String("="));
}
/*
* 按下数字键
*/
public void PressNum(String e,String str){
// if (e.equals("1") ||
// e.equals("2") ||
// e.equals("3") ||
// e.equals("4") ||
// e.equals("5") ||
// e.equals("6") ||
// e.equals("7") ||
// e.equals("8") ||
// e.equals("9") ||
// e.equals("0") ||
// e.equals(".")
// ) //1,2,3,4,5,6,7,8,9,0,.的实现;
// {
if(
//第一次是按数字或者在四则运算之后按数字,注意这里不包括数字前面是等于号
("+").equals((String)v2.lastElement()) ||
("-").equals((String)v2.lastElement()) ||
("x").equals((String)v2.lastElement()) ||
("/").equals((String)v2.lastElement()) ||
("init").equals((String)v2.lastElement())||
("sqrt").equals((String)v2.lastElement()) ||
("1/x").equals((String)v2.lastElement()) ||
("+/-").equals((String)v2.lastElement()) ||
("CE").equals((String)v2.lastElement())
)
{
tf.setText(e.toString());
}
else if(("^").equals((String)v2.lastElement())){
tf.setText(e.toString());
mark = Double.parseDouble(tf.getText());
}
//按了等于号后置sum为0重新开始新的计算
else if (("=").equals((String)v2.lastElement()))
{
sum=0;
tf.setText(e.toString());//显示按下的数字
}
//连续按下数字则连成字符串显示出来
else
{
tf.setText(tf.getText()+e.toString());//调用其父类中的getText()方法
mark = Double.parseDouble(tf.getText());
}
v2.addElement(new String(e.toString()));//将数字添加到向量中
// }
}
/**
* 除法键
*/
public void PressExc(String str) {
common(str);
v.addElement(new String("/"));
v2.addElement(new String("/"));
}
/*
* 按下.
*/
// public void Presspoint(String str){
// if((".").equals((String)v2.lastElement()
// )
// }
/**
* 公共方法
* @param str
*/
public void common(String str){
//getActionCommand返回与此命令相关的字符串
if(
/**
* 用户按了俩次运算符,包括上次的等于号,
也就是用户不进行连续运算时,则显示原来的数,
开机第一次按键 或者 第二次以后按键运算符没有连续此条件不走
例如6++
*/
//lastELement指向最后一个元素
("+").equals((String)v2.lastElement()) ||
("-").equals((String)v2.lastElement()) ||
("x").equals((String)v2.lastElement()) ||
("/").equals((String)v2.lastElement()) ||
("=").equals((String)v2.lastElement()) ||
("sqrt").equals((String)v2.lastElement()) ||
("1/x").equals((String)v2.lastElement()) ||
("^").equals((String)v2.lastElement()) ||
("+/-").equals((String)v2.lastElement())
)
{
tf.setText(String.valueOf(sum));
}
/**
* 当第一次按键是+时,也只有开机第一次才会执行此语句
*/
else if(("init").equals((String)v2.lastElement()))
{
tf.setText(String.valueOf(sum));//显示初始化的值
}
/**
* 用户进行连续运算时
* 或者
* 第一次按+键时
* (不是开机的第一次,开机的第一次按+键走上面的语句初始化文本框为0)
* 例如 0+ 而不是+0
*/
else
{
double d=Double.parseDouble(str);
/*************!!!注意:这里不是第一次相加***************/
//距离上次按+没有出现其他的三种运算即 X,/,-,可理解为连加
if (("+").equals((String)v.lastElement()))
{
sum=sum+d;
tf.setText(String.valueOf(sum));
}
//距离上次按-没有出现其他的三种运算即 X,/,+,可理解为 先减后加
else if (("-").equals((String)v.lastElement()))
{
//System.out.println("我连续按了俩次运算咯");
sum=sum-d;
tf.setText(String.valueOf(sum));
}
//距离上次按x没有出现其他的三种运算即 +,/,-,可理解为 先乘后加
else if(("x").equals((String)v.lastElement()))
{
sum=sum*d;
tf.setText(String.valueOf(sum));
}
//距离上次按/没有出现其他的三种运算即 X,+,-,可理解为 先除后加
else if(("/").equals((String)v.lastElement()))
{
sum=sum/d;
tf.setText(String.valueOf(sum));
}
else if(("^").equals((String)v.lastElement()))
{
Presspow();
}
else
{
sum=sum+d;
tf.setText(String.valueOf(sum));
}
}
}
/*
* 按下1/x
*/
public void PressDown(String str){
common(str);
sum = 1.0/sum ;
tf.setText(String.valueOf(sum));
v.addElement(new String("1/x"));
v2.addElement(new String("1/x"));
}
/*
* 按下x号
*/
public void PressMu(String str) {
common(str);
v.addElement(new String("x"));
v2.addElement(new String("x"));
}
/*
* 按下sqrt
*/
public void Presssqrt(String str){
common(str);
//System.out.println(sum);
sum = Math.sqrt(sum);
tf.setText(String.valueOf(sum));
v.addElement(new String("sqrt"));
v2.addElement(new String("sqrt"));
}
/*
* 按下^号
*/
public void Presspow(String str){
common(str);//先获得sum的值
v.addElement(new String("^"));
v2.addElement(new String("^"));
}
public void Presspow(){
//System.out.println(sum+"sum=====mark"+mark);
sum = Math.pow(sum, mark);
tf.setText(String.valueOf(sum));
}
/**
* 按下加号键
*/
public void Pressplus(String str){
common(str);
//将分别按键添加到俩个向量去,
v.addElement(new String("+"));
v2.addElement(new String("+"));
}
/*
* 按下减号
*/
public void PressCut(String str){
common(str);
v.addElement(new String("-"));
v2.addElement(new String("-"));
}
/**
* 按下清除键
*/
public void PressCE(){
//按下了清除键就什么都没啦
sum = 0;
tf.setText("0.0");
v.addElement(new String("CE"));
v2.addElement(new String("CE"));
}
/*
* 按下+/-号
*/
public void Pressagain(String str){
common(str);
sum = -1.0*sum;
tf.setText(String.valueOf(sum));
v.addElement(new String("+/-"));
v2.addElement(new String("+/-"));
}
}
下面是程序运行结果哦
最近有点忙可能更新博客的速度会慢了一点,但还是会继续坚持下去的,希望每天都能进步一点点~~~