import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class cal_sim_new extends JFrame
{
public static void main(String args[])
{
new cal_sim_new();
}
cal_sim_new()
{
super("简单计算器");
this.add(new Label("operator"),BorderLayout.NORTH);
this.add(new cPanel(),BorderLayout.CENTER);
this.add(new Label(),BorderLayout.WEST);
this.add(new Label(),BorderLayout.EAST);
this.add(new Label(),BorderLayout.SOUTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200,253);
this.setLocation (200,200);
this.setVisible(true);
}
class cPanel extends JPanel
{
JTextField tfResult;
JButton[] btn = new JButton[17];
public cPanel()
{
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 4;
this.add(new JLabel("JAVA计算器",JLabel.CENTER),c);
tfResult = new JTextField();
tfResult.setHorizontalAlignment(JTextField.CENTER);
tfResult.setEditable (false);
tfResult.setBackground (Color.WHITE);
tfResult.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent e)
{
char c = e.getKeyChar();
e.consume();
if(27==c)// esc键
process('退');
if(10==c)// enter键
process('=');
else if(c=='c')
process('清');
else if(cal.isOper(c) || '0'<=c&&c<='9')
process(c);
}
});
c.gridy = 1;
this.add(tfResult,c);
String s = "退出,清除,7,8,9,/,4,5,6,*,1,2,3,-,0,=,+";
String[] as = s.split(",");
BtnListener bl = new BtnListener();
for(int i=0; i<as.length; i++)
{
btn[i] = new JButton(as[i]);
btn[i].addActionListener(bl);
}
int i=0;
c.gridx = 0 ;
c.gridy = 2;
c.gridwidth = 2;
c.gridheight = 1;
this.add(btn[i++],c);
c.gridx = 2;
this.add(btn[i++],c);
c.gridwidth = 1;
for(int j=3; j<6; j++)
{
c.gridy = j;
for(int k=0; k<4; k++)
{
c.gridx = k;
this.add(btn[i++],c);
}
}
c.gridy = 6;
c.gridx = 0;
this.add(btn[i++],c);
c.gridx = 1;
c.gridwidth = 2;
this.add(btn[i++],c);
c.gridx = 3;
c.gridwidth = 1;
this.add(btn[i++],c);
}
class BtnListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JButton cBtn = (JButton)e.getSource();
String str = cBtn.getText();
process(str.charAt(0));
}
}
// 根据键盘或者鼠标操作,响应一个字符的操作,比如输入数字或者清除
int flag = 0; // 标记最后一次输入是否为数字
cal c = new cal();
void process(char ch)
{
if(ch=='退')
{
System.exit(0);
}
else if(ch=='清')
{
tfResult.setText("");
c.makeEmpty();
flag = 0;
}
else if(ch=='=')
{
// 判断当前显示是否为输入的
if(1==flag)
{
String reStr = c.update(tfResult.getText());
// 判断返回值是否为空,为空则正常显示,不为空则其为错误提示信息
if(reStr.equals(""))
tfResult.setText(c.getResult()+"");
else
tfResult.setText(reStr);
flag = 0;
}
else
{
tfResult.setText(c.getResult()+"");
}
}
else if(cal.isOper(ch))// 若是操作符
{
if(1==flag)
{
String reStr = c.update(tfResult.getText());
// 判断返回值是否为空,为空则正常显示,不为空则其为错误提示信息
if(reStr.equals(""))
{
c.update(ch+"");
tfResult.setText(ch+"");
}
else
tfResult.setText(reStr);
flag = 0;
}
else
{
c.update(ch+"");
tfResult.setText(ch+"");
}
}
else// 操作数
{
if(1==flag)
tfResult.setText(tfResult.getText()+ch);
else
{
// 判断是否为一次新的计算
String str = tfResult.getText();
if(str.equals("") || !cal.isOper(str))
c.makeEmpty();
tfResult.setText(ch+"");
flag = 1; // 标记最后一个为数字
}
}
}
}
}
class cal
{
double result; // 运算结果
double opNum; // 操作数
char ch; // 操作符
cal()
{
this.makeEmpty();
}
void makeEmpty()
{
this.result = 0;
this.opNum = 0;
this.ch = 0;
System.out.println("计算数据清空");
}
static boolean isOper(char ch)
{
String op = "+-*/";
for(int i=0; i<op.length(); i++)
{
if(op.charAt(i) == ch )
return true;
}
return false;
}
static boolean isOper(String str)
{
if(str.length() != 1)
return false;
String op = "+-*/";
for(int i=0; i<op.length(); i++)
{
if( op.charAt(i) == str.charAt(0))
return true;
}
return false;
}
// 运算方法,若成功返回一个空字符串,失败则返回一个包含错误提示的字符串
String update(String str)
{
if(0==str.length())// 调试用
{
System.out.println("null");
return "";
}
if(isOper(str))// 若是一个操作符
{
ch = str.charAt(0);
System.out.println("得到一个操作符:"+str);
}
else// 若为一个操作数,则先转换为double类型
{
try{
opNum = Double.parseDouble(str);
}catch(NumberFormatException e)
{
this.makeEmpty();
return "程序出现操作数转换异常!";
}
if(ch!=0)// 操作符不为零则开始进行运算
{
System.out.print("得到一个操作数"+opNum+",开始进行运算:"+result+ch+opNum+"=");
if(ch=='+')
{
result += opNum;
}
else if(ch == '-')
{
result -= opNum;
}
else if(ch == '*')
{
result *= opNum;
}
else
{
if(opNum != 0)
{
result /= opNum;
}
else
{
this.makeEmpty();
return "除数不能为零";
}
}
System.out.println(result);
}
else
{
System.out.println("得到一个操作数:"+opNum);
result = opNum;
}
}
return "";
}
double getResult()
{
return result;
}
}
java 实现 计算器
需积分: 0 123 浏览量
更新于2008-12-02
收藏 2KB RAR 举报
在Java编程语言中实现一个计算器是一项基础且实用的任务,它能帮助我们理解面向对象编程的基本概念,如类、对象、方法以及事件处理。下面将详细解释这个知识点。
一个简单的Java计算器通常会包含以下几个核心组件:
1. **类的设计**:在Java中,我们可以创建一个名为`Calculator`的类来封装计算器的逻辑。这个类可能会包含一些私有变量(如`result`用于存储计算结果)和公有方法(如`add()`, `subtract()`, `multiply()`, `divide()`等)。
2. **用户界面**:为了与用户交互,我们需要一个图形用户界面(GUI)。在Java中,我们可以使用Java Swing或JavaFX库来创建。例如,使用Swing,我们可以创建`JFrame`作为主窗口,然后添加`JButton`表示数字和运算符,`JTextField`显示计算过程和结果。
3. **事件监听**:当用户点击按钮时,我们需要响应这些事件。这可以通过实现`ActionListener`接口并重写`actionPerformed()`方法来完成。每个按钮都有一个关联的`ActionListener`,在用户点击时执行相应的计算操作。
4. **运算逻辑**:`Calculator`类中的方法对应于不同的运算功能。例如,`add()`方法接收两个参数,执行加法运算,并将结果存储在`result`变量中。其他方法类似,处理减法、乘法和除法。
5. **异常处理**:在处理除法时,我们需要考虑除数为零的情况,这会导致`ArithmeticException`。因此,需要使用`try-catch`块来捕获和处理这种异常。
6. **显示结果**:每次计算完成后,更新`JTextField`显示计算结果。可以使用`setText()`方法来修改文本框的内容。
以下是`cal_sim_new.java`文件可能包含的代码片段:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame {
private JTextField displayField;
private JButton[] numberButtons;
private JButton[] operatorButtons;
private double result;
public Calculator() {
// 构建UI
// ...
}
public void add ActionListener(ActionListener listener) {
// 为所有按钮添加事件监听器
// ...
}
private void add(double num) {
displayField.setText(displayField.getText() + String.valueOf(num));
}
private void calculate() {
try {
result = Double.parseDouble(displayField.getText());
// 执行实际的计算操作
// ...
displayField.setText(String.valueOf(result));
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(this, "无效的输入");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Calculator().setVisible(true));
}
}
```
这个简化的例子展示了如何在Java中创建一个基本的计算器程序。通过不断的练习和改进,可以增加更多功能,如括号支持、科学计算模式、历史记录等,从而进一步提升计算器的实用性。同时,这也是学习和掌握Java GUI编程的一个良好起点。
ming550077
- 粉丝: 0
- 资源: 2
最新资源
- 电子学习资料设计作品全资料家用音响设计制作资料
- 基于python的特色饮食情感分析语料库模型建立wlw源代码(python毕业设计完整源码+LW).zip
- 基于uni-app和colorUi的酒品商城小程序设计源码
- 基于python的书籍售卖系统源代码(python毕业设计完整源码+LW).zip
- 电子学习资料设计作品全资料简易智能电动车资料
- 基于Compute Shader的Unity神经网络与遗传算法训练源码设计
- 基于python的web服务统一身份认证协议设计源代码(python毕业设计完整源码+LW).zip
- 基于微信小程序的儿童摄影馆预约与互动服务平台设计源码
- 头帽组装检测机sw17可编辑全套技术资料100%好用.zip.zip
- 基于python的大学生就业信息管理系统(django)源代码(python毕业设计完整源码+LW).zip
- 电子学习资料设计作品全资料交通灯控制系统
- 基于C#语言开发的博锐ERP系统进销存系统代码源码
- 基于树莓派和DS18B20传感器的园林草坪自动喷灌系统设计源码
- 基于python的二维码生成算法研究和实现(django)源代码(python毕业设计完整源码+LW).zip
- 基于Python的YYS阴阳师对弈竞猜脚本设计源码
- 基于PHP语言的阿里巴巴旗下开放平台API调用SDK设计源码