一、实验目的
本实验的目的是掌握JAVA容器类JFrame和JPanel的使用;掌握Swing常用布局的使用;掌握常用可视组件的使用。
二、实验内容
完成一个简单的计算器的功能。实现的效果图如下所以:

实现的计算功能为:加、减、乘、除法、求余;“C”为清除,“<-“为退格等功能。
三、实验步骤
- 声明一个文本栏控件,用于显示计算结果
- 定义一个字符串数组,将计算器中按钮的文字都放在该数组中
- 声明一个按钮数组
- 使用BorderLayout.NORTH将文本栏控件放置在窗体框架的北部
- 使用GridLayout(5,4)设置一个网格布局并将该网格布局放到一个 JPanel面板上
- 分别实例化按钮监听对象和键盘监听对象
- 注册监听
- 设置窗口属性
- 写实现加减乘除取余计算的函数
- 写点击按钮监听类和键盘监听类(分别监听数字,运算符,退格和清 除)
四、实验结果





五、实验小结
本次实验我学会了JAVA容器类JFrame和JPanel的使用,还有键盘监听和按钮监听的使用。在设计计算器时,要把数字按钮(键盘),运算符按钮(键盘),清除按钮和退格按钮分开判断。在进行清除设计时,不能简单的把文本框设为空,而应该在将文本框设为空的同时,将其他值也设为初始值;在进行退格设计时,也不能简单的把文本框中的字符串长度减一,而是要进行判断,在退格之前的按钮类型是数字还是运算符。通过这次实验,我明白了,做一个程序需要有严谨的逻辑思维能力!
六、源代码
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame {
// 声明一个文本栏控件,用于显示计算结果
private JTextField txtResult;
private JPanel p;
// 定义一个字符串数组,将计算器中按钮的文字都放在该数组中
private String name[] = { "7", "8", "9", "+",
"4", "5", "6", "-",
"1", "2","3", "*",
"0", ".", "=", "/",
"<-", "C", "%", " "};
// 声明一个按钮数组,该数组的长度以字符串数组的长度为准
private JButton button[] = new JButton[name.length];
// 定义一个存放计算结果的变量,初始为0
private double result = 0;
// 存放最后一个操作符,初始为“=”
private String lastCommand = "=";
// 标识是否是开始
private boolean start = true;
String input;
char key;
public Calculator() {
super("计算器");
// 实例化文本栏控件
txtResult = new JTextField(20);
// 设置文本框不是焦点状态
txtResult.setFocusable(false);
// 将文本栏控件放置在窗体框架的上方(北部)
this.add(txtResult, BorderLayout.NORTH);
// 实例化面板对象,同时设置此面板布局为5行4列的网格布局
p = new JPanel(new GridLayout(5, 4));
// 循环实例化按钮对象数组
// 实例化按钮监听对象
ButtonAction ba = new ButtonAction();
// 实例化键盘监听对象
KeyAction ka = new KeyAction();
for (int i = 0; i < button.length; i++) {
button[i] = new JButton(name[i]);
// 注册监听
button[i].addActionListener(ba);
button[i].addKeyListener(ka);
p.add(button[i]);
}
this.add(p, BorderLayout.CENTER);
// 设定窗口大小
this.setSize(300, 300);
// 设定窗口左上角坐标
this.setLocation(200, 100);
// 设定窗口默认关闭方式为退出应用程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口可视(显示)
this.setVisible(true);
}
// 计算
public void calculate(double x) {
if (lastCommand.equals("+"))
result += x;
else if (lastCommand.equals("-"))
result -= x;
else if (lastCommand.equals("*"))
result *= x;
else if (lastCommand.equals("/"))
result /= x;
else if (lastCommand.equals("="))
result = x;
else if (lastCommand.equals("%"))
result %= x;
//else if (lastCommand.equals("C"))
// result = 0;
// 将结果显示在文本栏
txtResult.setText("" + result);
}
// 点击按钮监听
private class ButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
String input1=input;
input = e.getActionCommand();
// 点击操作符号按钮
if (input.equals("+") || input.equals("-") || input.equals("*")
|| input.equals("/") || input.equals("=") || input.equals("%")) {
if (start) {
if (input.equals("-")) {
txtResult.setText(input);
start = false;
}
else
lastCommand = input;
} else {
calculate(Double.parseDouble(txtResult.getText()));
lastCommand = input;
start = true;
}
} else if(input.equals("C")) {
result = 0;
lastCommand = "=";
start = true;
txtResult.setText(" ");
}else if(input.equals("<-")) {
if(input1.equals("+")|| input1.equals("-") || input1.equals("*")
|| input1.equals("/")|| input1.equals("%") ){
result=Double.parseDouble(txtResult.getText());
input1="=";
lastCommand = "=";
}else {
String a;
a=txtResult.getText();
a = a.substring(0, a.length()-1);
txtResult.setText(a);
}
}
else {
if (start) {
txtResult.setText("");
start = false;
}
txtResult.setText(txtResult.getText() + input);
}
}
}
// 键盘监听
private class KeyAction extends KeyAdapter {
public void keyTyped(KeyEvent e) {
char key1=key;
key = e.getKeyChar();
// 敲击的键盘是数字
if (key == '0' || key == '1' || key == '2' || key == '3'
|| key == '4' || key == '5' || key == '6' || key == '7'
|| key == '8' || key == '9' || key == '9') {
if (start) {
txtResult.setText("");
start = false;
}
txtResult.setText(txtResult.getText() + key);
}
// 敲击的键盘是操作符号
else if (key == '+' || key == '-' || key == '*' || key == '/'
|| key == '='|| key =='%') {
if (start) {
if (key == '-') {
txtResult.setText(String.valueOf(key));
start = false;
} else
lastCommand = String.valueOf(key);
} else {
calculate(Double.parseDouble(txtResult.getText()));
lastCommand = String.valueOf(key);
start = true;
}
}else if(key == 'c' || key == 'C') {
result = 0;
lastCommand = "=";
start = true;
txtResult.setText(" ");
}else if(key == 46) {
if(key1 == '+' || key1 == '-' || key1 == '*' || key1 == '/'|| key1 =='%' ){
//result=0;
key1='=';
lastCommand = "=";
}else {
String a;
a=txtResult.getText();
a = a.substring(0, a.length()-1);
txtResult.setText(a);
}
}
}
}
public static void main(String[] args) {
new Calculator();
}
}
网友评论