//计算器
package com.gui;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.text.AbstractDocument.BranchElement;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener,KeyListener{
//创建组件
MenuBar bar;
Menu menu_Look,menu_Edie,menu_Help;
MenuItem item_Biaozhun,item_Kexue;
MenuItem item_Copy,item_PastItem;
MenuItem item_LookHelp,item_About;
JTextField xianshi;
JButton[] numButtons,functionButtons,signButtons;
JPanel jPanel;
Font font =new Font("Serif",Font.BOLD,20);//设置字号
boolean root = false;//记录是否有过操作
String numString1;//作为字符串和double之间的中间转换着
String numstrString2;
double num_1,num_2;
double result_double;//接收计算结果
String result_string;//将结果转化成字符串
String ysfString = "+";
String ms=new String(); //用于MS键位接收数据
double dbms; //用来接收转换后的MS值
double dbm; //用来接收M+的值
String scpy; //用来接收拷贝的数据
public Calculator() {
super("计算器");
bar = new MenuBar();
menu_Look = new Menu("查看[V]");
menu_Edie = new Menu("编辑[E]");
menu_Help = new Menu("帮助[H]");
item_Biaozhun = new MenuItem("标准型");
item_Kexue = new MenuItem("科学型");
item_Copy = new MenuItem("复制");
item_PastItem = new MenuItem("粘贴");
item_LookHelp = new MenuItem("查看帮助");
item_About = new MenuItem("关于计算器");
xianshi = new JTextField("0",12);
xianshi.setFont(font);
xianshi.setEditable(false);
xianshi.setHorizontalAlignment(SwingConstants.RIGHT);
jPanel = new JPanel();
jPanel.setLayout(null);
//菜单的添加
menu_Look.add(item_Biaozhun);
menu_Look.add(item_Kexue);
menu_Edie.add(item_Copy);
menu_Edie.add(item_PastItem);
menu_Help.add(item_LookHelp);
menu_Help.add(item_About);
bar.add(menu_Look);
bar.add(menu_Edie);
bar.add(menu_Help);
setMenuBar(bar);//将下拉菜单添加到组件
//主操作区
xianshi.setBounds(25,10,200,30);
//功能键
String[] strings = {"MC","MR","MS","M+","M-","←","CE","C","±","√",
"7","8","9","/","%","4","5","6","*","1/x","1","2","3","-","=","0",".","+"};
functionButtons = new JButton[strings.length];
int j=2;
for (int i = 0; i < strings.length; i++) {
functionButtons[i] = new JButton(strings[i]);
functionButtons[i].addActionListener(this);
functionButtons[i].setMargin(new Insets(0,0,0,0));
if(i<5){
functionButtons[i].setBounds(25+40*i,50,35,30);
}else if(i>=5 && i<10){
functionButtons[i].setBounds(25+40*(i-5),90,35,30);
}else if (i>=10 && i<15) {
functionButtons[i].setBounds(25+40*(i-10),130,35,30);
}else if(i>=15 && i<20){
functionButtons[i].setBounds(25+40*(i-15),170,35,30);
}else if(i>=20&&i<24){
functionButtons[i].setBounds(25+40*(i-20),210,35,30);
}if (i==24) {
functionButtons[i].setBounds(25+40*(i-20), 210, 35, 70);
}
if(i==25){
functionButtons[i].setBounds(25, 250, 75, 30);
}else if (i==26|i==27) {
functionButtons[i].setBounds(25+j*40, 250, 35, 30);
j++;
}
jPanel.add(functionButtons[i]);
}
item_Biaozhun.addActionListener(this);
item_Kexue.addActionListener(this);
item_Copy.addActionListener(this);
item_About.addActionListener(this);
item_LookHelp.addActionListener(this);
item_PastItem.addActionListener(this);
jPanel.add(xianshi);
add(jPanel);
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.setSize(250,350);
calculator.setLocationRelativeTo(null);
calculator.setVisible(true);
calculator.setResizable(false);
calculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String xin = e.getActionCommand();//接受键盘
String old = xianshi.getText();//显示框原有数据
//0-9键盘
if ("0123456789".indexOf(xin) != -1) {
if (root) {
xianshi.setText(old+xin);
}else {
xianshi.setText(xin);
root = true;
}
}
//运算符键盘
else if("+-*/".indexOf(xin)!=-1){ //判断选择的运算符,
numString1 = old; //选择运算符后,将运算符之前的数据保存,
ysfString = xin; //重置ysfString,将选择的晕算符赋值给ysfString
String linshiString = old + xin;
xianshi.setText(linshiString);
root = false;
}
//小数点键
else if(".".equals(xin)){ //判断输入的是不是“.”
if(old.indexOf(xin)==-1){ //判断显示区域是否已经有“.”
xianshi.setText(old+xin);
root=true;
}
}
//正负号键
else if("±".equals(xin)){
if(old.startsWith("-")){ //判断输入的字符串如果是以“-”开头,就只是输出符号后面的字符串
xianshi.setText(old.substring(1));
}else{
xianshi.setText("-"+old);
}
}
//1/x键位
else if("1/x".equals(xin)){
num_1 = Double.parseDouble(old);
if(num_1==0){
xianshi.setText("除数不能为零");
root = false;
}else{
result_double= 1/num_1;
result_string=Double.toString(result_double);
xianshi.setText(result_string);
root = false;
}
}
//%键位
else if("%".equals(xin)){
double db=Double.parseDouble(xianshi.getText());
db=db/100;
String srg=Double.toString(db);
xianshi.setText(srg);
root = false;
}
//=键位
else if("=".equals(xin)){
num_1=Double.parseDouble(numString1);
num_2=Double.parseDouble(xianshi.getText());
if(ysfString=="+"){
result_double=num_1+num_2;
result_string=Double.toString(result_double);
xianshi.setText(result_string);
}else if(ysfString=="-"){
result_double=num_1-num_2;
result_string=Double.toString(result_double);
xianshi.setText(result_string);
}else if(ysfString=="*"){
result_double=num_1*num_2;
result_string=Double.toString(result_double);
xianshi.setText(result_string);
}else if(ysfString=="/"){
if(num_2 == 0){
xianshi.setText("除数不能为零!");
}else{
result_double=num_1/num_2;
result_string=Double.toString(result_double);
xianshi.setText(result_string);
}
}
root= false;
}
//CE键位
else if("CE".equals(xin)){
xianshi.setText("0");
num_2=0;
root = false;
}
//C键位
else if("C".equals(xin)){
xianshi.setText("0");
root = false;
}
//←键位
else if("←".equals(xin)){
if(old.length()>0){
xianshi.setText(old.substring(0,old.length()-1));
}
}
//开平方√
else if("√".equals(xin)){
num_1=Double.parseDouble(old);
if(num_1<0){
xianshi.setText("函数无效");
}else{
num_1=Math.sqrt(num_1);
xianshi.setText(Double.toString(num_1));
}
}
//MS:存当前显示的数值
else if("MS".equals(xin)){
ms=xianshi.getText();
dbms=Double.parseDouble(ms);
if(dbms!=0)
xianshi.setText("数据已经储存!");
root = false;
}
//MR:读取存储器中的数值,并显示出来
else if("MR".equals(xin)){
xianshi.setText(ms);
root = false;
}
//M+:用已存的数值加上当前显示的数值后,再将结果保存
else if("M+".equals(xin)){
dbm=Double.parseDouble(xianshi.getText());
result_double=dbm+dbms;
ms=Double.toString(result_double);
dbms=Double.parseDouble(ms);
xianshi.setText(ms);
root = false;
}
//M-:用已存的数值减去当前显示的数值后,再将结果保存
else if("M-".equals(xin)){
dbm=Double.parseDouble(xianshi.getText());
result_double=dbms-dbm;
ms=Double.toString(result_double);
dbms=Double.parseDouble(ms);
xianshi.setText(ms);
root = false;
}
//MC:清除已存的数据
else if("MC".equals(xin)){
ms="记忆数据清除!";
dbms = 0;
xianshi.setText(ms);
root = false;
}
//菜单上的监听实现
//复制键
else if(xin.equals("复制")){
scpy=xianshi.getText();
xianshi.setText("复制成功");
}
//粘贴键
else if(xin.equals("粘贴")){
xianshi.setText(scpy);
}
//标准型
else if(xin.equals("标准型")){
JOptionPane.showMessageDialog(this, "当前就是标准型计算器。");
}
//科学型
else if(xin.equals("科学型")){
JOptionPane.showMessageDialog(this, "小编正在彻夜编写中,敬请期待!");
}
//关于计算器
else if(xin.equals("关于计算器")){
JOptionPane.showMessageDialog(this, "版本型号:V1.0.0"+"\n"+"作者:董宏宇"+"\n"+"QQ:1358506549");
}
//计算器用法
else if(xin.equals("查看帮助")){
JOptionPane.showMessageDialog(this, "版本型号:V1.0.0"+"\n"+"MS:存当前显示的数值"+"\n"+"MR:读取存储器中的数值,并显示出来"+"\n"+"MC:清除已存的数据"+"\n"+"M-:用已存的数值减去当前显示的数值后,再将结果保存"+"\n"+"Backspace:退格键消除"+"\n"+"CE:清除一次输入"+"\n"+"C:清除数据,所有数据、算式都清除,归零复位");
}
}
}
简易计算器完美版
最新推荐文章于 2022-03-27 20:05:21 发布