该程序是一个图形界面的简单 Java 计算器,具有良好的界面,使用人员能快捷简单的进行加、减、 乘、除、操作。其程序要求为设计一个图形界面(GUI)的计算器应用程序,完成简单的加法、减法、乘 法、除法运算,且参与计算的数字和所得结果可以有小数点、正负号,同时还要具备清零功能。
一、需求分析 根据项目简介中的项目要求,我们将其具体需求做如下分析: 1. 要使用 java 的 GUI 设计出计算器界面。 2. 通过界面按钮,可以进行加减乘除运算,并能将结果显示在界面中。 3. 计算可以有小数点,和正负整数的计算。 4. 要有清零功能。
二、设计思路: 分析完项目需求后,接下来让我们看一下项目的设计思路。 1.本应用程序继承自框架类(Frame),此程序使用 Frame 布局管理器 BorderLayout,将包含单行文本 框和清零按钮的 Panel2 加入到“North”区域,包含各种按钮的面板 Panel1 加入到”Center”区域。包 含各种按钮的面板 Panel1 采用 4 行 4 列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到 面板中。 2.项目中要注册按钮事件监听器 ActionListener;事件监听器中的事件处理方法 public void actionPerformed(ActionEvent evt)完成主要的按钮事件的处理。 3.事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”„”8”,”9”)、运算符按钮事件(”+”,” -“,”*”,”/”)小数点按钮事件(”.”)、等号按钮事件(”=”)、清楚按钮事件(“CE”)。 4.计算器完成的是一个数学表达式,里面涉及到的就是加、减、乘、除的基本操作,仅需定义一个变 量来保存运算操作的前一个数字,与当前在计算器上的显示数字进行计算即可。
代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class Calculator implements ActionListener {
JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15,
b16;
JFrame f;
GridLayout c = new GridLayout(4, 4);
JTextField tf = new JTextField();
public void init() {
f = new JFrame("CardLayout testing");
Container ct = f.getContentPane();
tf.setHorizontalAlignment(JTextField.RIGHT);
ct.add(tf, "North");
JPanel p2 = new JPanel();
ct.add(p2, "Center");
GridLayout c = new GridLayout(4, 4);
p2.setLayout(c);
JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16;
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
b10 = new JButton("0");
b11 = new JButton(".");
b12 = new JButton("=");
b13 = new JButton("+");
b14 = new JButton("-");
b15 = new JButton("x");
b16 = new JButton("/");
p2.add(b1);
b1.addActionListener(this);
p2.add(b2);
b2.addActionListener(this);
p2.add(b3);
b3.addActionListener(this);
p2.add(b13);
b13.addActionListener(this);
p2.add(b4);
b4.addActionListener(this);
p2.add(b5);
b5.addActionListener(this);
p2.add(b6);
b6.addActionListener(this);
p2.add(b14);
b14.addActionListener(this);
p2.add(b7);
b7.addActionListener(this);
p2.add(b8);
b8.addActionListener(this);
p2.add(b9);
b9.addActionListener(this);
p2.add(b15);
b15.addActionListener(this);
p2.add(b10);
b10.addActionListener(this);
p2.add(b11);
b11.addActionListener(this);
p2.add(b12);
b12.addActionListener(this);
p2.add(b16);
b16.addActionListener(this);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(200, 180);
f.setVisible(true);
}
double sum = 0;
Vector v = new Vector(1, 1);
Vector v2 = new Vector(1, 1);
public Calculator() {
v2.addElement(new String("init"));
v.addElement(new String("init"));
}
public void actionPerformed(ActionEvent e) {
String str = tf.getText();
// 加号的实现
if (e.getActionCommand() == "+")
{
if (("+").equals((String) v2.lastElement())
|| ("-").equals((String) v2.lastElement())
|| ("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));
v2.addElement(new String("="));
} else {
double d = Double.parseDouble(str);
if (("+").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else if (("-").equals((String) v.lastElement())) {
sum = sum - d;
tf.setText(String.valueOf(sum));
} else if (("x").equals((String) v.lastElement())) {
sum = sum * d;
tf.setText(String.valueOf(sum));
} else if (("/").equals((String) v.lastElement())) {
sum = sum / d;
tf.setText(String.valueOf(sum));
} else if (("=").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else {
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v.addElement(new String("+"));
v2.addElement(new String("+"));
}
// 减号的实现
if (e.getActionCommand() == "-")
{
if (("+").equals((String) v2.lastElement())
|| ("-").equals((String) v2.lastElement())
|| ("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));
v2.addElement(new String("="));
} else {
double d = Double.parseDouble(str);
if (("+").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else if (("-").equals((String) v.lastElement())) {
sum = sum - d;
tf.setText(String.valueOf(sum));
} else if (("x").equals((String) v.lastElement())) {
sum = sum * d;
tf.setText(String.valueOf(sum));
} else if (("/").equals((String) v.lastElement())) {
sum = sum / d;
tf.setText(String.valueOf(sum));
} else if (("=").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else {
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v.addElement(new String("-"));
v2.addElement(new String("-"));
}
// 乘号的实现
if (e.getActionCommand() == "x")
{
if (("+").equals((String) v2.lastElement())
|| ("-").equals((String) v2.lastElement())
|| ("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));
v2.addElement(new String("="));
} else {
double d = Double.parseDouble(str);
if (("+").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else if (("-").equals((String) v.lastElement())) {
sum = sum - d;
tf.setText(String.valueOf(sum));
} else if (("x").equals((String) v.lastElement())) {
sum = sum * d;
tf.setText(String.valueOf(sum));
} else if (("/").equals((String) v.lastElement())) {
sum = sum / d;
tf.setText(String.valueOf(sum));
} else if (("=").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else {
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v.addElement(new String("x"));
v2.addElement(new String("x"));
}
// 除号的实现
if (e.getActionCommand() == "/")
{
if (("+").equals((String) v2.lastElement())
|| ("-").equals((String) v2.lastElement())
|| ("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));
v2.addElement(new String("="));
} else {
double d = Double.parseDouble(str);
if (("+").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else if (("-").equals((String) v.lastElement())) {
sum = sum - d;
tf.setText(String.valueOf(sum));
} else if (("x").equals((String) v.lastElement())) {
sum = sum * d;
tf.setText(String.valueOf(sum));
} else if (("/").equals((String) v.lastElement())) {
sum = sum / d;
tf.setText(String.valueOf(sum));
} else if (("=").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else {
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v.addElement(new String("/"));
v2.addElement(new String("/"));
}
// 等号实现
if (e.getActionCommand() == "=")
{
if (("+").equals((String) v2.lastElement())
|| ("-").equals((String) v2.lastElement())
|| ("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));
} else {
double d = Double.parseDouble(str);
if (("+").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
} else if (("-").equals((String) v.lastElement())) {
sum = sum - d;
tf.setText(String.valueOf(sum));
} else if (("x").equals((String) v.lastElement())) {
sum = sum * d;
tf.setText(String.valueOf(sum));
} else if (("/").equals((String) v.lastElement())) {
sum = sum / d;
tf.setText(String.valueOf(sum));
} else if (("=").equals((String) v.lastElement())) {
sum = sum + d;
tf.setText(String.valueOf(sum));
// tf.setText(String.valueOf(sum));
} else {
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v.addElement(new String("="));
v2.addElement(new String("="));
}
if (e.getActionCommand() == "1" || e.getActionCommand() == "2"
|| e.getActionCommand() == "3" || e.getActionCommand() == "4"
|| e.getActionCommand() == "5" || e.getActionCommand() == "6"
|| e.getActionCommand() == "7" || e.getActionCommand() == "8"
|| e.getActionCommand() == "9" || e.getActionCommand() == "0"
|| e.getActionCommand() == ".") // 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())) {
tf.setText("");
tf.setText(e.getActionCommand());
} else if (("=").equals((String) v2.lastElement())) {
sum = 0;
tf.setText("");
tf.setText(e.getActionCommand());
} else {
tf.setText(tf.getText() + e.getActionCommand());// 调用其父类中的getText()方法
}
v2.addElement(new String(e.getActionCommand()));
}
}
public static void main(String args[]) {
new Calculator().init();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JCalculator extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = -6675736133730301893L;
private class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
}
int i;
// Strings for Digit & Operator buttons.
private final String[] str = { "7", "8", "9", "/", "4", "5", "6", "*", "1",
"2", "3", "-", ".", "0", "=", "+" };
// Build buttons.
JButton[] buttons = new JButton[str.length];
// For cancel or reset.
JButton reset = new JButton("CE");
// Build the text field to show the result.
JTextField display = new JTextField("0");
/**
* Constructor without parameters.
*/
public JCalculator() {
super("计算器");
// Add a panel.
JPanel panel1 = new JPanel(new GridLayout(4, 4));
// panel1.setLayout(new GridLayout(4,4));
for (i = 0; i < str.length; i++) {
buttons[i] = new JButton(str[i]);
panel1.add(buttons[i]);
}
JPanel panel2 = new JPanel(new BorderLayout());
// panel2.setLayout(new BorderLayout());
panel2.add("Center", display);
panel2.add("East", reset);
// JPanel panel3 = new Panel();
getContentPane().setLayout(new BorderLayout());
getContentPane().add("North", panel2);
getContentPane().add("Center", panel1);
// Add action listener for each digit & operator button.
for (i = 0; i < str.length; i++)
buttons[i].addActionListener(this);
// Add listener for "reset" button.
reset.addActionListener(this);
// Add listener for "display" button.
display.addActionListener(this);
// The "close" button "X".
addWindowListener(new WindowCloser());
// Initialize the window size.
setSize(800, 800);
// Show the window.
// show(); Using show() while JDK version is below 1.5.
setVisible(true);
// Fit the certain size.
pack();
}
public void actionPerformed(ActionEvent e) {
Object target = e.getSource();
String label = e.getActionCommand();
if (target == reset)
handleReset();
else if ("0123456789.".indexOf(label) > 0)
handleNumber(label);
else
handleOperator(label);
}
// Is the first digit pressed?
boolean isFirstDigit = true;
/**
* Number handling.
* @param key the key of the button.
*/
public void handleNumber(String key) {
if (isFirstDigit)
display.setText(key);
else if ((key.equals(".")) && (display.getText().indexOf(".") < 0))
display.setText(display.getText() + ".");
else if (!key.equals("."))
display.setText(display.getText() + key);
isFirstDigit = false;
}
/**
* Reset the calculator.
*/
public void handleReset() {
display.setText("0");
isFirstDigit = true;
operator = "=";
}
double number = 0.0;
String operator = "=";
/**
* Handling the operation.
* @param key pressed operator's key.
*/
public void handleOperator(String key) {
if (operator.equals("+"))
number += Double.valueOf(display.getText());
else if (operator.equals("-"))
number -= Double.valueOf(display.getText());
else if (operator.equals("*"))
number *= Double.valueOf(display.getText());
else if (operator.equals("/"))
number /= Double.valueOf(display.getText());
else if (operator.equals("="))
number = Double.valueOf(display.getText());
display.setText(String.valueOf(number));
operator = key;
isFirstDigit = true;
}
public static void main(String[] args) {
new JCalculator();
}
}
程序运行结果为:
更多知识欢迎关注微信公众号“51学代码”
网址:www.51xcode.com[链接](http://www.51xcode.com)
作者博客:https://hello1024.world (你好1024的世界)链接