`
南瓜静涵
  • 浏览: 763 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

小型计算器

阅读更多


    这个计算器的功能有:
    1.十进制的四则运算和平方
    2.进制间的转换

代码如下:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class MainFrame extends JFrame implements ActionListener {
	// 文本框内容存储
	private StringBuilder sbValue = new StringBuilder();
	// 数值的处理
	private long op1, op2, op3, op4 = 0;
	private int preOp, currentOp = 0;
	// 运算数标记
	private int mathMark = 0;
	// 判断标记
	private boolean flag = true;
	// 默认进制为10
	private int log = 10;
	// 进制转换单选按钮
	private JRadioButton jScale16;
	private JRadioButton jScale8;
	private JRadioButton jScale2;
	private JRadioButton jScale10;
	// 输入输出文本条
	private JTextField tf;
	// + - * / 运算符
	private JButton jOperator;
	// 平方运算
	private JButton jSqrt;
	// 1-9 a-f 按钮

    private JButton jNum;

	private JButton[] buts = { jNum, jNum, jNum, jNum, jNum, jNum, jNum, jNum, jOperator, jNum,
			jNum jNum, jNum, jOperator, jSqrt, jNum, jNum, jNum, jOperator, jOperator, jNum,
			jOperator, jOperator, jOperator, jOperator };
	private String[] strs = { "a", "c", "c", "d", "e", "7", "8", "9", "/", "f",
			"4", "5", "6", "*", "sqrt", "1", "2", "3", "-", "CE", "0", "+/-",
			".", "+", "=" };

	public MainFrame() {
		init();
	}

	private void init() {
		setBounds(400, 160, 460, 280);
		setContentPane(createContentpane());
		// 设置按钮状态
		setStates(10);
	}

	// 主面板
	private JPanel createContentpane() {
		// TODO Auto-generated method stub
		JPanel p = new JPanel(new BorderLayout());
		// 1.创建 菜单面板
		p.add(BorderLayout.NORTH, createTitleMenu());

		// 2.创建 计算面板
		p.add(BorderLayout.CENTER, createCountPanel());

		// 3.创建软件信息面板
		p.add(BorderLayout.SOUTH, createInfoPanel());
		return p;
	}

	// 3.创建软件信息面板
	private JLabel createInfoPanel() {
		// TODO Auto-generated method stub
		JLabel l = new JLabel("科学计算器", JLabel.RIGHT);
		return l;
	}

	// 1.创建 菜单面板
	private JMenuBar createTitleMenu() {
		// TODO Auto-generated method stub
		JMenuBar m = new JMenuBar();
		m.add(createMenu());
		return m;
	}

	// 1.1 菜单
	private JMenu createMenu() {
		// TODO Auto-generated method stub
		JMenu menu = new JMenu("查看");
		return menu;
	}

	// 2.创建 计算面板
	private JPanel createCountPanel() {
		JPanel p = new JPanel(new BorderLayout());
		p.add(BorderLayout.NORTH, createTextField());
		p.add(BorderLayout.CENTER, createMathPanel());
		return p;
	}

	// 2.1 输入框
	private JTextField createTextField() {
		tf = new JTextField("0.", 26);

		// 文本对齐为右对齐,即光标在右
		tf.setHorizontalAlignment(JTextField.RIGHT);

		// 文本条不可输入
		tf.setEditable(false);
		return tf;
	}

	// 数字按钮
	// 主计算按钮
	private JPanel createMathPanel() {
		JPanel p = new JPanel(new BorderLayout());

		p.add(BorderLayout.CENTER, createValuePanel());
		p.add(BorderLayout.NORTH, createToolPanel());

		return p;
	}

	// 进制面板
	private JPanel createToolPanel() {
		JPanel p = new JPanel(new BorderLayout());
		p.add(createScaleJButton());
		return p;
	}

	// 进制转换按钮
	private JPanel createScaleJButton() {
		JPanel p = new JPanel(new GridLayout(1, 4, 3, 0));

		ButtonGroup bg = new ButtonGroup();
		// 十六
		jScale16 = new JRadioButton("十六进制");
		setJRadioButtonPrperties(jScale16);
		bg.add(jScale16);
		p.add(jScale16);
		// 八
		jScale8 = new JRadioButton("八进制");
		setJRadioButtonPrperties(jScale8);
		bg.add(jScale8);
		p.add(jScale8);
		// 二
		jScale2 = new JRadioButton("二进制");
		setJRadioButtonPrperties(jScale2);
		bg.add(jScale2);
		p.add(jScale2);
		// 十
		jScale10 = new JRadioButton("十进制", true);
		setJRadioButtonPrperties(jScale10);
		bg.add(jScale10);
		p.add(jScale10);
		return p;
	}

	private void setJRadioButtonPrperties(JRadioButton jRB) {
		jRB.setForeground(Color.red);
		jRB.setMargin(new Insets(3, 3, 3, 3));
		jRB.addActionListener(this);
	}

	// 生成并设置面板所有按钮
	private JPanel createValuePanel() {
		JPanel p = new JPanel();
		p.setLayout(new GridLayout(5, 5, 3, 2));
		// 自动生成所有按钮
		createAndSetButton(p);
		return p;
	}

	// 自动生成所有按钮
	private void createAndSetButton(JPanel p) {
		for (int x = 0; x < 25; x++) {
			buts[x] = new JButton(strs[x]);
			// 设置按钮属性
			setButtonPrperties(buts[x], strs[x]);
			p.add(buts[x]);
		}

	}

	// 设置按钮属性
	private void setButtonPrperties(JButton jBut, String str) {
		if (str.matches("\\d")) {
			jBut.setForeground(Color.blue);
		} else if (str.matches("[a-f]")) {
			jBut.setForeground(Color.black);
		} else {
			jBut.setForeground(Color.red);
		}

		jBut.setMargin(new Insets(3, 3, 3, 3));
		jBut.addActionListener(this);
	}

	/**
	 * 所有按钮事件监听
	 */
	public void actionPerformed(ActionEvent e) {
		// 获取 按钮的 value
		String value = e.getActionCommand();

		if (value.equals("+")) {
			mathMark = 1;
			mathOperator(mathMark);
		} else if (value.equals("-")) {
			mathMark = 2;
			mathOperator(mathMark);
		} else if (value.equals("*")) {
			mathMark = 3;
			mathOperator(mathMark);
		} else if (value.equals("/")) {
			mathMark = 4;
			mathOperator(mathMark);
		} else if (value.equals("=")) {
			mathMark = 5;
			mathOperator(mathMark);
		} else if (value.equals("sqrt")) {
			mathMark = 6;
			mathOperator(mathMark);
		} else if (value.equals("CE")) {
			ceOperator();
		} else if (value.equals("十六进制")) {
			toHexOperator();
			log = 16;
		} else if (value.equals("八进制")) {
			toOctalOperator();
			log = 8;
		} else if (value.equals("二进制")) {
			toBinaryOperator();
			log = 2;
		} else if (value.equals("十进制")) {
			toShiOperator();
		} else if (value.matches("\\w")) {
			// 0-9 的数字转换
			numOperator(value);
		}
	}

	// 0-9 的数字转换
	// 数值操作
	private void numOperator(String value) {
		if (value.equals("0")) {
			if (tf.getText().equals("0.")) {
				tf.setText("0.");
			} else {
				if (log != 10) {
					tf.setText(sbValue.append(value).toString());
				} else {
					tf.setText(sbValue.append(value).toString());
					op2 = Long.parseLong(tf.getText().trim());
					op1 = op2;
					op3 = op1;
				}
				System.out.println("op2..值0.." + op2);
			}
		} else {
			if (log == 16) {
				tf.setText(sbValue.append(value).toString());
			} else if (log ==    8 ) {
				tf.setText(sbValue.append(value).toString());
			} else if (log == 2) {
				tf.setText(sbValue.append(value).toString());
			} else {
				tf.setText(sbValue.append(value).toString());
				op2 = Long.parseLong(tf.getText().trim());
				System.out.println(op2);
				if (currentOp == 0) {
					op1 = op2;
					op3 = op1;
				}
			}
		}
	}

	// 10进制
	private void toShiOperator() {
		setStates(10);
		if (!tf.getText().trim().equals("0.")) {
			scale();
		}
		if (op3 != 0) {

			if (sbValue.length() != 0) {

				System.out.println("转十进制的op3是。。。" + op3);
				tf.setText(Long.toString(op3));
			} else {
				tf.setText("0.");
				sbValue.setLength(0);
			}
		}
	}

	// 2进制
	private void toBinaryOperator() {
		flag = false;
		setStates(2);
		if (!tf.getText().trim().equals("0.")) {
			scale();
			if (op3 != 0) {

				if (sbValue.length() != 0) {
					tf.setText(Long.toBinaryString(op3));
				} else {
					tf.setText("0.");
					sbValue.setLength(0);
				}
			}
		}
	}

	// 8进制
	private void toOctalOperator() {
		setStates(8);
		if (!tf.getText().trim().equals("0.")) {
			scale();
			if (op3 != 0) {
				if (sbValue.length() != 0) {
					// System.out.println("转八进制的op3是。。。" + op3);
					tf.setText(Long.toOctalString(op3));
				} else {
					tf.setText("0.");
					sbValue.setLength(0);
				}
			}
		}
	}

	// 16进制
	private void toHexOperator() {
		setStates(16);
		if (!tf.getText().trim().equals("0.")) {
			scale();
			if (op3 != 0) {
				if (sbValue.length() != 0) {
					// System.out.println("转十六进制的op3是。。。" + op3);
					tf.setText(Long.toHexString(op3));
				} else {
					tf.setText("0.");
					sbValue.setLength(0);
				}
			}
		}
	}

	// 进制
	private void scale() {
		if (op4 == 0) {
			if (log == 16) {
				op4 = Long.parseLong(tf.getText(), 16);
				tf.setText(Long.toString(op3));
			} else if (log ==  8 ) {
				op4 = Long.parseLong(tf.getText(), 8 );
				tf.setText(Long.toString(op3));
			} else if (log ==  2 ) {
				op4 = Long.parseLong(tf.getText(),  2 );
				tf.setText(Long.toString(op3));
			} else {
				if (tf.getText().equals("0.")) {
				} else {
					op4 = Long.parseLong(tf.getText());
				}
			}
			op3 = op4;
		}
	}

	// 清空,回到初始化状态
	private void ceOperator() {
		tf.setText("0.");
		sbValue.delete(0, sbValue.length());
		jScale10.setSelected(true);
		op3 = op4 = op1 = op2 = 0;
		log = 10;
		preOp = 0;
		currentOp = 0;
		flag = true;
		mathMark = 0;
		setStates(10);
	}

	// 数学运算
	private void mathOperator(int mark) {
		if (mark == 5) {
			if (currentOp == 0) {
				sbValue.setLength(0);
				tf.setText("" + op2);

			} else {
				sbValue.setLength(0);
				currentOp = preOp;
				select(currentOp);
			}
		} else if (mark == 6) {
			if (!tf.getText().trim().equals("0.")) {
				long op5 = op3 * op3;
				tf.setText(op5 + "");
				op3 = op5;
				sbValue.setLength(0);
			}
		} else {
			sbValue.setLength(0);
			if (currentOp == 0) {
				preOp = currentOp = mark;
				tf.setText("" + op1);
			} else {
				currentOp = preOp;
				preOp = mark;
				select(currentOp);
			}
		}
	}

	private void select(int opCurrent) {
		switch (opCurrent) {
		case 1:
			op1 = op1 + op2;
			tf.setText("" + op1);
			op3 = op1;
			break;
		case 2:
			op1 = op1 - op2;
			tf.setText("" + op1);
			op3 = op1;
			break;
		case 3:
			op1 = op1 * op2;
			tf.setText("" + op1);
			op3 = op1;
			break;
		case 4:
			op1 = op1 / op2;
			tf.setText("" + op1);
			op3 = op1;
			break;
		}
	}

	// 改变按钮状态
	private void setStates(int logValue) {
		for (int x = 0; x < 25; x++) {
			if (logValue == 10) {
				buts[x].setEnabled(true);
				if (strs[x].matches("[a-f]")) {
					buts[x].setEnabled(false);
				}
			} else if (logValue == 16 ) {
				buts[x].setEnabled(true);
			} else if (logValue ==  8 ) {
				buts[x].setEnabled(true);
				if (strs[x].matches("[8-9 a-f]")) {
					buts[x].setEnabled(false);
				}
			} else if (logValue == 2) {
				buts[x].setEnabled(true);
				if (strs[x].matches("[2-9 a-f]")) {
					buts[x].setEnabled(false);
				}
			}
		}
	}
}
 


分享到:
评论
1 楼 ShmilyDR 2012-05-30  
nice...

相关推荐

    小型计算器程序编写

    本项目“小型计算器程序编写”就是一个基于C语言的实践案例,它旨在教授如何构建一个简单的图形用户界面(GUI)计算器。下面将详细探讨这个项目中的关键知识点。 首先,我们关注的是C语言编程基础。C语言是一种低级...

    小型计算器(java )

    【标题】"小型计算器(java)" 在Java编程语言中,创建一个小型计算器是一项常见的练习,它可以帮助初学者理解和应用基本的编程概念,如控制流程、数据类型、运算符以及用户输入处理。这个小型计算器项目通常包括加、...

    表达式求值,类似于一个小型计算器

    在本例中,我们有一个小型计算器的实现,它能够处理四则运算(加、减、乘、除)并考虑运算符的优先级。这个功能通常在解释器或编译器中被用到,比如一个简单的命令行计算器程序。 首先,我们需要理解表达式的基本...

    MFC实现小型计算器

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现一个小型计算器。MFC 是 Microsoft 提供的一个 C++ 类库,它封装了 Windows API,为开发 Windows GUI 应用程序提供了便利。 首先,理解...

    实现加、减、乘、除的小型计算器

    在本文中,我们将深入探讨如何使用VC++6.0实现一个小型计算器,它能执行基本的加、减、乘、除运算。VC++6.0是Microsoft Visual C++的一个早期版本,它是一个集成开发环境(IDE),用于编写C++代码,并且支持Windows ...

    小型计算器的实现

    在编程领域,小型计算器的实现是一项基础且重要的任务,它涉及到计算机科学中的基本逻辑和算法。这个项目通过堆栈的数据结构来实现一个简单的计算器,帮助我们深入理解计算过程中的内部机制。堆栈是一种后进先出...

    小型计算器可以进行加减乘除运算,可以连续进行计算!

    根据给定的信息,我们可以分析并总结出以下与小型计算器相关的知识点: ### 小型计算器功能概述 该小型计算器能够执行基本的数学运算:加法、减法、乘法、除法以及幂运算(即指数运算)。它允许用户连续输入多个...

    JAVA 课程设计 小型计算器

    在本次的JAVA课程设计中,学生设计了一个小型计算器,该计算器具有图形用户界面,能够执行基本的四则运算,包括整数和实数的运算。以下是关于这个小型计算器的详细知识点: 1. **图形用户界面 (GUI)**:计算器使用...

    用C#实现小型计算器

    在本文中,我们将深入探讨如何使用C#编程语言来实现一个小型计算器。C#是一种面向对象的、现代的编程语言,由微软公司开发,广泛应用于Windows应用程序开发、游戏开发、Web服务等。在这个实例中,我们将基于C# 2005...

    简单的小型计算器(Java)

    本项目是一个"简单的小型计算器",它展示了如何用Java语言实现基本的算术运算,如加、减、乘、除。 首先,我们需要了解Java程序的基本结构。一个Java程序通常由一个或多个类组成,每个类包含若干方法。在这个小型...

    汇编课程设计一个小型计算器

    汇编语言的小型计算器 设计一个能满足以下功能要求的计算器程序。 首先显示计算器功能菜单:1、加法2、减法3、乘法4、除法0、退出 然后在屏上提示:“请用户选择:0-4” 选择“1”:再提示输入两个数据,做加法运算...

    C语言编写的小型计算器

    小型计算器,拥有CS的图标,实现加减乘的功能。

    一个小型计算器的VC代码,有背景图片,开机启动画面,供参考学习

    在这个小型计算器项目中,开发者可能使用了MFC(Microsoft Foundation Classes)库来构建用户界面,这是一个面向对象的C++库,简化了Windows应用程序的开发。 2. **背景图片**:计算器程序使用了背景图片来装饰用户...

    一个小型计算器(+-*/)

    在本文中,我们将深入探讨如何使用C#编程语言创建一个小型计算器,该计算器支持基本的四则运算(加法、减法、乘法和除法)。对于初学者来说,这是一个很好的练习项目,可以帮助理解控制流、函数以及用户输入处理等...

    小型计算器(C++)

    【小型计算器(C++)】是一个基于C++编程语言开发的简易计算工具,旨在提供基础的算术运算以及可能的科学计算功能。这个项目可能是为了教学目的或者是个人编程实践,旨在帮助学习者理解C++中的输入输出处理、条件语句...

    exlp.rar_小型计算器_计算器_计算器 java

    标题中的"exlp.rar_小型计算器_计算器_计算器 java"表明这是一个使用Java语言开发的小型计算器项目,可能是一个源代码压缩包。这个计算器能够执行基本的数学运算,包括加法、减法、乘法、除法以及开方运算。下面我们...

    calculate.rar_小型计算器

    【标题】"calculate.rar_小型计算器"所涉及的知识点主要集中在计算器软件的开发与使用上。小型计算器通常指的是轻量级、操作简单的计算工具,它能够执行基本的数学运算,如加减乘除、求平方根、百分比计算等。在...

    java编程:最短代码实现小型计算器

    java编程:最短代码实现小型计算器java编程: 最短代码实现小型计算器

Global site tag (gtag.js) - Google Analytics