关于计算器的简单实现
2015-07-09 23:41
197 查看
JAVA简单的实现计算器的功能可以选择用窗体来写,具体步骤如下:
1.建立一个计算器Calculator 的实体类继承 JFrame ,实现ActionListener 的接口。在类中定义实现需要的常量变量,构造器中书写窗体
2书写一个方法 初始化文本框与按钮,生成界面,重写actionPerformed方法,注册监听器
3.书写方法,实现运算
4.建立一个测试类测试代码
具体代码如下:
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;
/**
* 计算器类
*
* @author Administrator
*
*/
public class Calculator extends JFrame implements ActionListener {
private static final long serialVersionUID = 2499964079704437558L;
private JTextField result; // 显示运算结果的文本框
private JButton[] buttons; // 所有的按钮对象
private final String[] characters = { "7", "8", "9", "/", "4", "5", "6",
"*", "1", "2", "3", "-", "0", ".", "=", "+" }; // 所有的按钮文本
private boolean isFirstDigit = true; // 标记第一次输入数字
private String operator = "="; // 运算符
private double resultNum = 0.0; // 运算结果
public Calculator(String title) {
// 标题栏
super(title);
// 大小
setSize(220, 200);
// 居中
setLocationRelativeTo(null);
// 默认关闭操作
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 禁止修改大小
setResizable(false);
// 初始化文本框与按钮
generateInterface();
// 显示
setVisible(true);
}
/**
* 初始化文本框与按钮,生成界面
*/
private void generateInterface() {
/* 文本框 */
result = new JTextField("0");
// 右对齐
result.setHorizontalAlignment(JTextField.RIGHT);
// 不允许编辑
result.setEditable(false);
// 将文本框添加到窗体北方
add(result, BorderLayout.NORTH);
/* 按钮 */
buttons = new JButton[characters.length];
JPanel pnl = new JPanel(new GridLayout(4, 4, 5, 5));
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(characters[i]);
buttons[i].addActionListener(this);
buttons[i].setFocusable(false); // 不允许按钮定位焦点
pnl.add(buttons[i]);
}
// 将所有按钮添加到窗体的中间
add(pnl, BorderLayout.CENTER);
// 允许内容面板定位焦点
this.getContentPane().setFocusable(true);
// 注册内容面板事件监听器
// 适配器
this.getContentPane().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
char ch = e.getKeyChar(); // 获取按钮字符
/* 处理数字或运算符 */
if ('.' == ch || Character.isDigit(ch)) { // 数字小数点
handleNumber(String.valueOf(ch));
} else if ("+-*/=".indexOf(ch) != -1 || e.getKeyCode() == 10) { // 运算符
handleOperator(String.valueOf(ch));
} else if (e.getKeyCode() == 8) { // 退格键
String tmp = result.getText();
if (tmp.length() == 1) {
result.setText("0");
isFirstDigit = true;
} else {
result.setText(tmp.substring(0, tmp.length() - 1));
}
}
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取点击按钮的文本
String text = e.getActionCommand();
/* 处理数字或运算符 */
if (".".equals(text) || Character.isDigit(text.charAt(0))) { // 数字小数点
handleNumber(text);
} else if ("+-*/=".indexOf(text) != -1) { // 运算符
handleOperator(text);
}
}
/**
* 处理数字与小数点
*
* @param text
*/
private void handleNumber(String text) {
if (isFirstDigit) { // 第一次输入
if (".".equals(text)) {
this.result.setText("0.");
} else {
this.result.setText(text);
}
} else if ("0".equals(text) && "0".equals(this.result.getText())) { // 第二次或多次输入0
isFirstDigit = true;
return;
} else if (".".equals(text) && this.result.getText().indexOf(".") == -1) {
this.result.setText(this.result.getText() + ".");
} else if (!".".equals(text)) {
this.result.setText(this.result.getText() + text);
}
isFirstDigit = false;
}
/**
* 处理运算符
*
* @param text
*/
private void handleOperator(String text) {
char ch = operator.charAt(0);
switch (ch) {
case '+':
resultNum += Double.parseDouble(this.result.getText());
break;
case '-':
resultNum -= Double.parseDouble(this.result.getText());
break;
case '*':
resultNum *= Double.parseDouble(this.result.getText());
break;
case '/':
resultNum /= Double.parseDouble(this.result.getText());
break;
case '=':
resultNum = Double.parseDouble(this.result.getText());
break;
}
// 将运算结果显示到文本框中
this.result.setText(String.valueOf(resultNum));
// 将参数运算符放入成员变量中
this.operator = text;
// 下一个数字是第一次输入
isFirstDigit = true;
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
new Calculator("My Calculator");
}
}
1.建立一个计算器Calculator 的实体类继承 JFrame ,实现ActionListener 的接口。在类中定义实现需要的常量变量,构造器中书写窗体
2书写一个方法 初始化文本框与按钮,生成界面,重写actionPerformed方法,注册监听器
3.书写方法,实现运算
4.建立一个测试类测试代码
具体代码如下:
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;
/**
* 计算器类
*
* @author Administrator
*
*/
public class Calculator extends JFrame implements ActionListener {
private static final long serialVersionUID = 2499964079704437558L;
private JTextField result; // 显示运算结果的文本框
private JButton[] buttons; // 所有的按钮对象
private final String[] characters = { "7", "8", "9", "/", "4", "5", "6",
"*", "1", "2", "3", "-", "0", ".", "=", "+" }; // 所有的按钮文本
private boolean isFirstDigit = true; // 标记第一次输入数字
private String operator = "="; // 运算符
private double resultNum = 0.0; // 运算结果
public Calculator(String title) {
// 标题栏
super(title);
// 大小
setSize(220, 200);
// 居中
setLocationRelativeTo(null);
// 默认关闭操作
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 禁止修改大小
setResizable(false);
// 初始化文本框与按钮
generateInterface();
// 显示
setVisible(true);
}
/**
* 初始化文本框与按钮,生成界面
*/
private void generateInterface() {
/* 文本框 */
result = new JTextField("0");
// 右对齐
result.setHorizontalAlignment(JTextField.RIGHT);
// 不允许编辑
result.setEditable(false);
// 将文本框添加到窗体北方
add(result, BorderLayout.NORTH);
/* 按钮 */
buttons = new JButton[characters.length];
JPanel pnl = new JPanel(new GridLayout(4, 4, 5, 5));
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(characters[i]);
buttons[i].addActionListener(this);
buttons[i].setFocusable(false); // 不允许按钮定位焦点
pnl.add(buttons[i]);
}
// 将所有按钮添加到窗体的中间
add(pnl, BorderLayout.CENTER);
// 允许内容面板定位焦点
this.getContentPane().setFocusable(true);
// 注册内容面板事件监听器
// 适配器
this.getContentPane().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
char ch = e.getKeyChar(); // 获取按钮字符
/* 处理数字或运算符 */
if ('.' == ch || Character.isDigit(ch)) { // 数字小数点
handleNumber(String.valueOf(ch));
} else if ("+-*/=".indexOf(ch) != -1 || e.getKeyCode() == 10) { // 运算符
handleOperator(String.valueOf(ch));
} else if (e.getKeyCode() == 8) { // 退格键
String tmp = result.getText();
if (tmp.length() == 1) {
result.setText("0");
isFirstDigit = true;
} else {
result.setText(tmp.substring(0, tmp.length() - 1));
}
}
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取点击按钮的文本
String text = e.getActionCommand();
/* 处理数字或运算符 */
if (".".equals(text) || Character.isDigit(text.charAt(0))) { // 数字小数点
handleNumber(text);
} else if ("+-*/=".indexOf(text) != -1) { // 运算符
handleOperator(text);
}
}
/**
* 处理数字与小数点
*
* @param text
*/
private void handleNumber(String text) {
if (isFirstDigit) { // 第一次输入
if (".".equals(text)) {
this.result.setText("0.");
} else {
this.result.setText(text);
}
} else if ("0".equals(text) && "0".equals(this.result.getText())) { // 第二次或多次输入0
isFirstDigit = true;
return;
} else if (".".equals(text) && this.result.getText().indexOf(".") == -1) {
this.result.setText(this.result.getText() + ".");
} else if (!".".equals(text)) {
this.result.setText(this.result.getText() + text);
}
isFirstDigit = false;
}
/**
* 处理运算符
*
* @param text
*/
private void handleOperator(String text) {
char ch = operator.charAt(0);
switch (ch) {
case '+':
resultNum += Double.parseDouble(this.result.getText());
break;
case '-':
resultNum -= Double.parseDouble(this.result.getText());
break;
case '*':
resultNum *= Double.parseDouble(this.result.getText());
break;
case '/':
resultNum /= Double.parseDouble(this.result.getText());
break;
case '=':
resultNum = Double.parseDouble(this.result.getText());
break;
}
// 将运算结果显示到文本框中
this.result.setText(String.valueOf(resultNum));
// 将参数运算符放入成员变量中
this.operator = text;
// 下一个数字是第一次输入
isFirstDigit = true;
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
new Calculator("My Calculator");
}
}
相关文章推荐
- Java.Lang.NoSuchMethod 错误
- 查看PHP编译参数
- win7通过securecrt连接VMware中的centOS安装FTP服务器
- 细说String和StringBuffer
- Rectangle Area
- sip协议_2
- 先内核转储文件再gdb调试
- 多态的应用 例子CODE01--head first
- FTP服务器及FTP基于MariaDB实现访问控制
- Linux关闭防火墙命令
- 应用层如何保证一个包的完整性?
- cdn缓存
- dumpstate uid 由root-->shell
- WordPress插件开发实例教程 - 版权插件
- 一位java大牛10年资料总结
- Source-php-request-1
- servlet中web.xml配置详解
- JAVA IO流
- java 多态测试(abstract)
- 学习CSS(2)