java做的简易计算器

可以实现科学型和标准型的转换,标准型的功能完善,科学型的功能没全部写

java小白,有啥问题希望大神可以指正!!

下列代码是标准型的代码,科学型的可以自己补充,无非就是复制粘贴调参

package Jisuanqi;
/** 简易计算器 开根号只能先输入数字在点击开根号
* created by 晴眸若初
*
*/
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
public class Calculator extends JFrame implements ActionListener{
//创建一个界面窗口
private JFrame jiemian = new JFrame();
//创建按键的名字,并创建对应的按钮
private String[] keys = {"%","CE","C","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="};
private JButton[] buttons = new JButton[keys.length];
//计算的结果 文本框显示 result_txt
private JTextField result_txt = new JTextField("0");
//标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private boolean firstDigit = true;
//当前运算的运算符
private String now_key = "=";
//计算的中间结果
private double resultNum = 0.0000;
//判断当前操作是否合法
private boolean operatelegal = true;
//创建菜单
//private Menu mineMenu;
private JMenu menu;
private JMenu help;
private JMenuItem biaozhun;
private JMenuItem kexue;
private JMenuItem about;
public Calculator() {
init(); //初始化计算器
jiemian.setTitle("简易计算器 by 晴眸若初");
jiemian.setSize(380,450);
jiemian.setLocation(500, 300);
//不允许修改计算器窗口大小
jiemian.setResizable(false);
JMenuBar zkm = new JMenuBar();
jiemian.setJMenuBar(zkm);
jiemian.setVisible(true);
menu = new JMenu("菜单");
help = new JMenu("帮助");
biaozhun = new JMenuItem("标准型(B)");
kexue = new JMenuItem("科学型(K)");
about = new JMenuItem("关于(P)");
menu.add(biaozhun);
biaozhun.setMnemonic('b');
menu.add(kexue);
kexue.setMnemonic('k');
help.add(about);
about.setMnemonic('p');
zkm.add(menu);
zkm.add(help);
kexue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Calculator2();
jiemian.setVisible(false);
}
});
// biaozhun.addActionListener(new ActionListener(){
//public void actionPerformed(ActionEvent e) {
//new Calculator();
Calculator2.this.setVisible(false);
//}
//});
about.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new About();
}
});
jiemian.pack();
//关闭窗口
jiemian.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 调用主函数,运行程序
*/
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exception e) {
System.out.println(e);
}
new Calculator();
}
/**
* 初始化函数 init();
*
*/
private void init() {
//设置各个部分颜色
Color color1 = new Color(150, 150, 150); //功能键和运算符颜色 中灰色
Color color2 = new Color(137, 207, 240); //等于号专属颜色 浅蓝色
Color color3 = new Color(232, 232, 232); //背景颜色也是灰色 深灰色
JPanel Panel = new JPanel();
Panel.setLayout(new BorderLayout());
Panel.add(result_txt);
//设置文本框中文字的字体以及大小,加粗,内容采用右对齐方式
result_txt.setFont(new Font("楷体",Font.BOLD,43));
result_txt.setHorizontalAlignment(JTextField.RIGHT);
result_txt.setEditable(false); //不能修改结果文本框
result_txt.setBorder(null); //删除文本框的边框
// 设置文本框背景颜色
result_txt.setBackground(color1);
//创建一个放置按钮的面板
JPanel keysPanel = new JPanel();
//网格布局,6行4列,网格之间水平与垂直间隔2像素
keysPanel.setLayout(new GridLayout(6, 4, 2, 2));
//初始化前两行按键的功能
for(int i = 0; i < 8; i++) {
buttons[i] = new JButton(keys[i]);
keysPanel.add(buttons[i]);
buttons[i].setBackground(color3);
//设置按钮文本的前景色
buttons[i].setForeground(Color.black);
//设置字体显示效果 18磅粗的字体
buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
buttons[i].setBorderPainted(false); //去除按钮的边框
}
for(int i = 8; i < keys.length; i++) {
buttons[i] = new JButton(keys[i]);
keysPanel.add(buttons[i]);
if((i+1)%4==0) buttons[i].setBackground(color3); //将三四五行第四列的按钮设置为color3
else buttons[i].setBackground(Color.white);
buttons[i].setForeground(Color.black);
buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 18));
buttons[i].setBorderPainted(false); //去除按钮的边框
}
//“=”键使用浅蓝色 按钮所在面板使用深灰色
buttons[23].setBackground(color2);
keysPanel.setBackground(color1);
//将文本框放在北部,将按钮面板放在中部
jiemian.getContentPane().add("North", Panel);
jiemian.getContentPane().add("Center", keysPanel);
//设置面板的边框属性
Panel.setBorder(BorderFactory.createMatteBorder(25,3,1,3,color1));
keysPanel.setBorder(BorderFactory.createMatteBorder(6,3,3,3,color1));
//添加事件监听器
for(int i=0;i
buttons[i].addActionListener(this);
}
}
/**
* 事件监听
*/
public void actionPerformed(ActionEvent e) {
//获取事件,即用户的指令
String zhiling = e.getActionCommand();
if(zhiling.equals(keys[3])) {
//用户点了“back”
goBack();
}else if(zhiling.equals(keys[1])) {
//用户按了“CE”,当前数字清零
result_txt.setText("0");
}else if(zhiling.equals(keys[2])) {
//用户按“C”,初始化计算器
goC();
}else if("0123456789.".indexOf(zhiling) >= 0) {
//利用indexOf判断,若是没有出现0-9和.,则返回-1
goNum(zhiling);
}else if(zhiling.equals(keys[0]) || zhiling.equals(keys[4]) || zhiling.equals(keys[5]) ||
zhiling.equals(keys[6]) || zhiling.equals(keys[20])) {
// 用户按了"求倒数,%,开方,平方,取正负数"
goDeal1(zhiling);
} else {
goDeal2(zhiling);
}
}
/**
* 当用户按下“Back”后如何处理
*/
private void goBack() {
String text = result_txt.getText();
int i = text.length();
if (i > 0) {
text = text.substring(0, i - 1); // 退格,将文本最后一个字符去掉
if (text.length() == 0) {
// 如果文本没有内容了,则初始化计算器的各种值
result_txt.setText("0");
firstDigit = true;
now_key = "=";
} else {
// 显示新的文本
result_txt.setText(text);
}
}
}
/**
* 当用户按下“C”后如何处理:初始化计算器
*/
private void goC() {
// 初始化计算器的各种值
result_txt.setText("0");
firstDigit = true;
now_key = "=";
}
/**
* 当用户按下数字键后如何处理
*/
private void goNum(String key) {
if (firstDigit) {
// 输入的为第一个数
result_txt.setText(key);
} else if ((key.equals(".")) && (result_txt.getText().indexOf(".") < 0)) {
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
result_txt.setText(result_txt.getText() + ".");
} else if (!key.equals(".")) {
// 如果输入的不是小数点,则将数字附在结果文本框的后面
result_txt.setText(result_txt.getText() + key);
}
firstDigit = false;
}
/**
* 当用户按下运算符后如何处理,分两种情况:1.简单单目运算符 2.双目运算符
*/
//第一种情况
private void goDeal1(String key) {
now_key = key; // 运算符为用户按的按钮
if (now_key.equals("1⁄x")) {
// 倒数运算
if (resultNum == 0) {
operatelegal = false; //操作不合法
result_txt.setText("零没有倒数");
} else {
resultNum = 1 / getNumberFromText();
}
} else if (now_key.equals("√x")) {
// 开平方运算
if (resultNum < 0) {
operatelegal = false; //操作不合法
result_txt.setText("根号内不能为负");
} else {
resultNum = Math.sqrt(getNumberFromText());
}
} else if (now_key.equals("X²")) {
// 平方运算
resultNum = getNumberFromText()*getNumberFromText();
} else if (now_key.equals("%")) {
// 百分号运算,除以100
resultNum = getNumberFromText() / 100;
} else if (now_key.equals("+/-")) {
// 正数负数运算
resultNum = getNumberFromText() * (-1);
if (operatelegal) {
// 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
result_txt.setText(String.valueOf(t1));
} else {
result_txt.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
}
}
firstDigit = true;
operatelegal = true;
}
}
//第二种情况
private void goDeal2(String key) {
if (now_key.equals("÷")) { //除法运算
// 如果当前结果文本框中的值等于0
if (getNumberFromText() == 0.0) {
operatelegal = false; //操作不合法
result_txt.setText("除数不能为零");
} else {
resultNum /= getNumberFromText();
}
} else if (now_key.equals("+")) {
// 加法运算
resultNum += getNumberFromText();
} else if (now_key.equals("-")) {
// 减法运算
resultNum -= getNumberFromText();
} else if (now_key.equals("X")) {
// 乘法运算
resultNum *= getNumberFromText();
} else if (now_key.equals("=")) {
// 赋值运算
resultNum = getNumberFromText();
}
if (operatelegal) {
// 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
result_txt.setText(String.valueOf(t1));
} else {
result_txt.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));
}
}
now_key = key; // 运算符为用户按的按钮
firstDigit = true;
operatelegal = true;
}
/**
* 从文本框中获取文本,并将文本转化为数字
*/
private double getNumberFromText() {
double result = 0;
//将文本框中的内容转换成一个Double对象,然后利用Double内的方法变成double
try {
result = Double.valueOf(result_txt.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}
}