这个计算器的功能有:
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);
}
}
}
}
}
分享到:
相关推荐
本项目“小型计算器程序编写”就是一个基于C语言的实践案例,它旨在教授如何构建一个简单的图形用户界面(GUI)计算器。下面将详细探讨这个项目中的关键知识点。 首先,我们关注的是C语言编程基础。C语言是一种低级...
【标题】"小型计算器(java)" 在Java编程语言中,创建一个小型计算器是一项常见的练习,它可以帮助初学者理解和应用基本的编程概念,如控制流程、数据类型、运算符以及用户输入处理。这个小型计算器项目通常包括加、...
在本例中,我们有一个小型计算器的实现,它能够处理四则运算(加、减、乘、除)并考虑运算符的优先级。这个功能通常在解释器或编译器中被用到,比如一个简单的命令行计算器程序。 首先,我们需要理解表达式的基本...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现一个小型计算器。MFC 是 Microsoft 提供的一个 C++ 类库,它封装了 Windows API,为开发 Windows GUI 应用程序提供了便利。 首先,理解...
在本文中,我们将深入探讨如何使用VC++6.0实现一个小型计算器,它能执行基本的加、减、乘、除运算。VC++6.0是Microsoft Visual C++的一个早期版本,它是一个集成开发环境(IDE),用于编写C++代码,并且支持Windows ...
在编程领域,小型计算器的实现是一项基础且重要的任务,它涉及到计算机科学中的基本逻辑和算法。这个项目通过堆栈的数据结构来实现一个简单的计算器,帮助我们深入理解计算过程中的内部机制。堆栈是一种后进先出...
根据给定的信息,我们可以分析并总结出以下与小型计算器相关的知识点: ### 小型计算器功能概述 该小型计算器能够执行基本的数学运算:加法、减法、乘法、除法以及幂运算(即指数运算)。它允许用户连续输入多个...
在本次的JAVA课程设计中,学生设计了一个小型计算器,该计算器具有图形用户界面,能够执行基本的四则运算,包括整数和实数的运算。以下是关于这个小型计算器的详细知识点: 1. **图形用户界面 (GUI)**:计算器使用...
在本文中,我们将深入探讨如何使用C#编程语言来实现一个小型计算器。C#是一种面向对象的、现代的编程语言,由微软公司开发,广泛应用于Windows应用程序开发、游戏开发、Web服务等。在这个实例中,我们将基于C# 2005...
本项目是一个"简单的小型计算器",它展示了如何用Java语言实现基本的算术运算,如加、减、乘、除。 首先,我们需要了解Java程序的基本结构。一个Java程序通常由一个或多个类组成,每个类包含若干方法。在这个小型...
汇编语言的小型计算器 设计一个能满足以下功能要求的计算器程序。 首先显示计算器功能菜单:1、加法2、减法3、乘法4、除法0、退出 然后在屏上提示:“请用户选择:0-4” 选择“1”:再提示输入两个数据,做加法运算...
小型计算器,拥有CS的图标,实现加减乘的功能。
在这个小型计算器项目中,开发者可能使用了MFC(Microsoft Foundation Classes)库来构建用户界面,这是一个面向对象的C++库,简化了Windows应用程序的开发。 2. **背景图片**:计算器程序使用了背景图片来装饰用户...
在本文中,我们将深入探讨如何使用C#编程语言创建一个小型计算器,该计算器支持基本的四则运算(加法、减法、乘法和除法)。对于初学者来说,这是一个很好的练习项目,可以帮助理解控制流、函数以及用户输入处理等...
【小型计算器(C++)】是一个基于C++编程语言开发的简易计算工具,旨在提供基础的算术运算以及可能的科学计算功能。这个项目可能是为了教学目的或者是个人编程实践,旨在帮助学习者理解C++中的输入输出处理、条件语句...
标题中的"exlp.rar_小型计算器_计算器_计算器 java"表明这是一个使用Java语言开发的小型计算器项目,可能是一个源代码压缩包。这个计算器能够执行基本的数学运算,包括加法、减法、乘法、除法以及开方运算。下面我们...
【标题】"calculate.rar_小型计算器"所涉及的知识点主要集中在计算器软件的开发与使用上。小型计算器通常指的是轻量级、操作简单的计算工具,它能够执行基本的数学运算,如加减乘除、求平方根、百分比计算等。在...
java编程:最短代码实现小型计算器java编程: 最短代码实现小型计算器