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 80 浏览量
更新于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编程的一个良好起点。
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
ming550077
- 粉丝: 0
- 资源: 2
最新资源
- Proteus 7.8超再生模块接收发送仿真源程序实现:433MHz单片机通信实战演练,单片机433MHz超再生模块:Proteus仿真收发功能实现与原理说明,单片机433MHz超再生模块发送接收Pr
- 基于TypeScript和Html的跨语言Awaken设计源码分享与优化
- 基于MATLAB Simulink建模的双侧独立电驱动履带车转向控制研究:涵盖PI与SMC算法比较,适应大、中半径及原地转向工况,基于MATLAB Simulink建模的双侧独立电驱动履带车转向控制研
- 基于VSG预同步控制与自适应转动惯量的离并网无缝切换技术,基于VSG预同步控制的自适应转动惯量无缝并网切换技术,VSG预同步控制与自适应转动惯量 离并网无缝切 ,VSG预同步控制; 自适应转动惯量
- COMSOL光学计算:BICs合并技术,带能、品质因子及远场偏振可视化解析,详细视频教程,COMSOL光学模拟:BICs合并、能带与品质因子计算及远场偏振箭头绘制教程,详解视频教学,comsol计算光
- 基于SpringBoot与Vue的校友社交管理系统源码设计
- 基于Python的剪切板监听图片识别进入白板设计源码
- 基于Comsol软件的超声换能器相控阵聚焦仿真研究,基于Comsol仿真平台:超声换能器聚焦及相控阵仿真技术研究,Comsol超声能器聚焦 仿真 超声能器相控阵聚焦仿真 ,Comsol; 超声换能器
- 基于Java和Kotlin的SASS电影票管理系统父类设计源码
- 基于Java开发的演唱会在线购票系统设计源码
- 欧姆龙CP1H与台达VFD-M变频器:MODBUS RTU简易主站通讯的PLC程序设计与应用,欧姆龙CP1H与台达VFD-M变频器:基于MODBUS RTU简易主站的轮询通讯保护策略与PLC程序解析
- 基于COMSOL接口的Matlab编程:快速构建三维随机裂隙网络模型,《COMSOL中高效导入的三维随机裂隙网络模型编程生成》,矩形三维随机裂隙网络 使用COMSOL with Matlab接口编程
- 基于Java语言的实时公交系统设计源码
- Simulink仿真模型:基于自适应虚拟阻抗下垂控制改进的双机并联孤岛模式,解决线路阻抗差异导致的无功功率不均分问题(模型版本2018b及以上),Simulink仿真模型下的双机并联下垂控制改进:自适
- 基于Vue框架的人脸考勤系统设计源码
- 电动汽车Simulink仿真模型:整车动力性能与能耗测试模拟平台(支持NEDC工况),电动汽车Simulink仿真模型:整车动力性测试与能耗仿真分析,电动汽车 simulink仿真模型, 可进行整车动