Java计算器是一款在Java平台上开发的计算器工具,其拥有丰富简洁的界面、完备的数学运算以及出色的用户体验,备受广大程序员的青睐。今天,本篇文章就将为大家提供一份完整的Java计算器源代码,让我们来一起学习和了解这款优秀的计算工具吧!
一、Java计算器源代码
Java计算器源代码包含若干个类,其主要实现的功能包括计算器界面的设计以及各种数学运算的实现。以下是Java计算器的主要源代码:
1.计算器界面设计
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Calculator extends JFrame {
private static final long serialVersionUID = 1L;
// 定义各个组件
private JPanel[] panels;
private JButton[] buttons;
private String[] buttonLabels = {
"7", "8", "9", "÷",
"4", "5", "6", "×",
"1", "2", "3", "-",
"0", ".", "C", "+"
};
private JLabel resultLabel;
public Calculator() {
super("计算器");
// 初始化各个组件
panels = new JPanel[5];
buttons = new JButton[buttonLabels.length];
resultLabel = new JLabel("0", JLabel.RIGHT);
// 设置窗口属性
setResizable(false);
setLocationRelativeTo(null); // 在屏幕中央显示
setSize(250, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置布局
setLayout(new GridLayout(5, 1));
// 初始化各个面板
for (int i = 0; i < panels.length; i++) {
panels[i] = new JPanel();
panels[i].setBackground(Color.WHITE);
}
// 设置标签属性
resultLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
resultLabel.setBackground(Color.WHITE);
resultLabel.setOpaque(true);
resultLabel.setFont(resultLabel.getFont().deriveFont(24f));
// 添加组件
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(buttonLabels[i]);
buttons[i].setFont(buttons[i].getFont().deriveFont(16f));
buttons[i].setForeground(Color.BLUE);
buttons[i].setBackground(Color.WHITE);
switch (i) {
case 3:
case 7:
case 11:
case 15:
buttons[i].setForeground(Color.RED);
}
panels[i / 4].add(buttons[i]); // 添加按钮
}
panels[4].setLayout(new GridLayout(1, 2));
panels[4].add(resultLabel); // 添加标签
panels[4].add(buttons[14]);
for (int i = 0; i < panels.length; i++) {
add(panels[i]);
}
setVisible(true); // 显示窗口
}
}
2.数学运算实现
import java.math.BigDecimal;
import java.util.Stack;
public class Arithmetic {
private String expression; //待计算表达式
public Arithmetic(String expression) {
this.expression = expression;
}
/**
* 获取计算结果
*/
public BigDecimal getResult() {
Stack
Stack
opStack.push('#');
int index = 0;
char[] arr = expression.toCharArray();
while (index < arr.length) {
char c = arr[index];
if ('0' <= c && c <= '9') {
StringBuilder sb = new StringBuilder();
sb.append(c);
while (++index < arr.length) {
c = arr[index];
if ('0' <= c && c <= '9') {
sb.append(c);
} else {
break;
}
}
BigDecimal num = new BigDecimal(sb.toString());
numStack.push(num);
} else {
switch (c) {
case '+':
case '-':
while (opStack.peek() == '*' || opStack.peek() == '/' || opStack.peek() == '%') {
op(numStack, opStack);
}
opStack.push(c);
index++;
break ;
case '%':
opStack.push(c);
index++;
break ;
case '*':
case '/':
while (opStack.peek() == '%') {
op(numStack, opStack);
}
opStack.push(c);
index++;
break ;
case '(':
opStack.push(c);
index++;
break ;
case ')':
opStack.pop();
index++;
break ;
case '#':
while (opStack.peek() != '#') {
op(numStack, opStack);
}
break ;
default :
index++; // 跳过百分号等其他符号
break ;
}
}
}
while (!opStack.isEmpty() && opStack.peek() != '#') {
op(numStack, opStack);
}
return numStack.pop();
}
/**
* 定义运算符优先级
*/
private static int compare(char a, char b) {
if ((a == '*' || a == '/') && (b == '+' || b == '-'))
return -1;
if ((a == '+' || a == '-') && (b == '*' || b == '/'))
return 1;
return 0;
}
/**
* 根据运算符计算结果
*/
private static void op(Stack
BigDecimal num2 = numStack.pop();
BigDecimal num1 = numStack.pop();
char op = opStack.pop();
switch (op) {
case '+':
numStack.push(num1.add(num2));
break ;
case '-':
numStack.push(num1.subtract(num2));
break ;
case '*':
numStack.push(num1.multiply(num2));
break ;
case '/':
numStack.push(num1.divide(num2, 10, BigDecimal.ROUND_HALF_UP));
break ;
case '%':
numStack.push(num1.remainder(num2));
break ;
}
}
}
二、源代码详解
1.计算器界面设计
Java计算器的界面主要由若干个组件构成,包括数字按钮、运算符按钮、清空按钮以及结果显示标签。在本源代码中,我们通过JPanel面板的方式来布局各个组件,并使用GridLayout实现了网格布局的效果。具体的步骤如下:
1) 继承JFrame类,设置窗口属性,包括标题、大小、位置和关闭方式。
public class Calculator extends JFrame {
private static final long serialVersionUID = 1L;
public Calculator() {
super("计算器");
// 设置窗口属性
setResizable(false);
setLocationRelativeTo(null); // 在屏幕中央显示
setSize(250, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 窗口布局
setLayout(new GridLayout(5, 1));
}
}
2) 初始化各个组件,包括数字按钮、运算符按钮、清空按钮以及结果标签,同时设置按钮颜色属性。
public Calculator() {
// 声明组件
panels = new JPanel[5];
buttons = new JButton[buttonLabels.length];
resultLabel = new JLabel("0", JLabel.RIGHT);
// 初始化面板
for (int i = 0; i < panels.length; i++) {
panels[i] = new JPanel();
panels[i].setBackground(Color.WHITE);
}
// 初始化按钮
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(buttonLabels[i]);
buttons[i].setFont(buttons[i].getFont().deriveFont(16f));
buttons[i].setForeground(Color.BLUE);
buttons[i].setBackground(Color.WHITE);
switch (i) {
case 3:
case 7:
case 11:
case 15:
buttons[i].setForeground(Color.RED);
}
panels[i / 4].add(buttons[i]); // 将按钮添加到面板中
}
}
3) 将各个面板和组件添加到JFrame中,并设置显示效果。
public Calculator() {
...
// 添加面板和标签组件
panels[4].setLayout(new GridLayout(1, 2));
panels[4].add(resultLabel);
panels[4].add(buttons[14]);
for (int i = 0; i < panels.length; i++) {
add(panels[i]);
}
setVisible(true); // 显示
}
2.数学运算实现
Java计算器的数学运算主要依赖于Arithmetic类来实现。在该类中,我们定义了各种数学运算操作的具体实现方式,包括加、减、乘、除、取模等操作。同时,通过栈的数据结构,我们可以很方便地处理各种嵌套的运算表达式。
1) 定义Arithmetic类,该类包含待计算表达式和计算结果两个属性。
public class Arithmetic {
private String expression; // 待运算表达式
public Arithmetic(String expression) {
this.expression = expression;
}
/**
* 获取计算结果
*/
public BigDecimal getResult() {
// 初始化栈、操作符号和输入字符数组
Stack
Stack
opStack.push('#');
int index = 0;
char[] arr = expression.toCharArray();
while (index < arr.length) {
char c = arr[index];
if ('0' <= c && c <= '9') {
// 当输入字符为数字时,提取出该数字
StringBuilder sb = new StringBuilder();
sb.append(c);
while (++index < arr.length) {
c = arr[index];
if ('0' <= c && c <= '9') {
sb.append(c);
} else {
break;
}
}
BigDecimal num = new BigDecimal(sb.toString());
numStack.push(num);
} else {
// 当输入字符为运算符时,将其插入栈中
switch (c) {
case '+':
case '-':
// 当前运算符为加减号时,弹出栈顶乘除号,计算结果后再插入栈中
while (opStack.peek() == '*' || opStack.peek() == '/' || opStack.peek() == '%') {
op(numStack, opStack);
}
opStack.push(c);
index++;
break ;
case '%':
// 当前运算符为取模号时,直接将其插入栈中
opStack.push(c);
index++;
break ;
case '*':
case '/':
// 当前运算符为乘除号时,弹出栈顶取模号,计算结果后再插入栈中
while (opStack.peek() == '%') {
op(numStack, opStack);
}
opStack.push(c);
index++;
break ;
case '(':
// 当前运算符为左括号时,直接插入栈中
opStack.push(c);
index++;
break ;
case ')':
// 当前运算符为右括号时,将其弹出栈顶,并计算对应表达式的结果
opStack.pop();
index++;
break ;
case '#':
// 计算结束,计算栈中的所有运算符及数字的结果
while (opStack.peek() != '#') {
op(numStack, opStack);
}
break ;
default :
index++; // 跳过百分号等其他符号
break ;
}
}
}
// 计算所有剩余的栈顶元素
while (!opStack.isEmpty() && opStack.peek() != '#') {
op(numStack, opStack);
}
return numStack.pop();
}
}
2) 定义运算符优先级,只有当运算符优先级正确时,才可以进行计算操作。
private static int compare(char a, char b) {
if ((a == '*' || a == '/') && (b == '+' || b == '-'))
return -1;
if ((a == '+' || a == '-') && (b == '*' || b == '/'))
return 1;
return 0;
}
3) 根据运算符计算结果。该方法根据不同的运算符号,进行不同的数学计算操作。
private static void op(Stack
BigDecimal num2 = numStack.pop();
BigDecimal num1 = numStack.pop();
char op = opStack.pop();
switch (op) {
case '+':
numStack.push(num1.add(num2));
break ;
case '-':
numStack.push(num1.subtract(num2));
break ;
case '*':
numStack.push(num1.multiply(num2));
break ;
case '/':
numStack.push(num1.divide(num2, 10, BigDecimal.ROUND_HALF_UP));
break ;
case '%':
numStack.push(num1.remainder(num2));
break ;
}
}
三、源代码优化建议
Java计算器的源代码虽然简单易懂,并且功能完善,但是其存在一些设计和实现上的问题。例如:
1.计算器的窗口大小固定,无法根据不同屏幕自适应大小。
2.计算器的数字按钮和其他运算符按钮混合在一起,不便于用户查找。
3.计算器的运算符优先级计算方式存在问题。
4.运算表达式的输入方式单一,不足以满足用户不同的输入需求。
5.异常处理机制不完整,容易导致程序崩溃或产生异常。
因此,我们针对这些问题,可以在源代码基础上进行进一步的改进和优化,以提高计算器的性能和使用体验。
四、总结
通过本篇文章的阅读,相信大家已经了解了Java计算器的完整源代码和实现方式。Java计算器不仅功能齐全,而且界面简洁,使用起来十分便利。通过对该源代码的分析和学习,我们可以更好地掌握Java语言的面向对象编程技巧,同时提高数学计算的能力。在今后的程序设计中,我们可以依据Java计算器的源代码来开发更加优秀的计算器程序,以满足用户不同的需求。