代码拉取完成,页面将自动刷新
package Calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame implements ActionListener {
/**
* 以下为 计算器外观显示设置
*/
private final String[] Number1 ={ // 基本功能键
"sin","cos","tan","ln","log",
"D->B","D->O","mod","x^2","x^3",
"7","8","9","1/x","√",
"4","5","6","+","-",
"1","2","3","*","/",
"0",".","(-)","!","="
};
private final String[] Number2 ={ //删除、归零键
"DEL","AC"
};
private JButton num1[] = new JButton[Number1.length];
private JButton num2[] = new JButton[Number2.length];
private JTextField result = new JTextField("0"); // 显示框 及其 字体设置
private Font font = new Font("华文行楷",Font.BOLD,30);
private String symbol = "="; // 当前运算的运算符
double resultNumber = 0.0; // 计算结果
private boolean firstNumber = true; // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private boolean Flag = true; // 判断相关操作是否合理
public Calculator(){
init();
this.setBackground(Color.GRAY); // 计算器背景颜色
this.setTitle("宇宙牌计算器");
this.setSize(595, 500); // 尺寸
this.setResizable(false); // 固定计算器的大小
this.setLocationRelativeTo(null);
}
private void init() { // 初始化
// TODO Auto-generated method stub
JMenuBar jmb = new JMenuBar(); // 菜单栏
JMenu help = new JMenu("帮助");
JMenu about1 = new JMenu("关于计算器");
JMenu about2 = new JMenu("关于产商");
JMenuItem about3 = new JMenuItem("林俊伟");
JMenuItem about4 = new JMenuItem("程会青");
jmb.add(help);
help.add(about1);
help.add(about2);
about2.add(about3);
about2.add(about4);
this.setJMenuBar(jmb);
result.setHorizontalAlignment(JTextField.RIGHT); // 显示框内容采用右对齐
result.setFont(font);
result.setBackground(Color.GRAY); // 灰底白字
result.setForeground(Color.WHITE);
JPanel jp1 = new JPanel(); // 两个按钮面板的外观设置
jp1.setLayout(new GridLayout(6,5,3,3));// 用网格布局器,6行5列,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
for(int i = 0;i<Number1.length;i++){
num1[i] = new JButton(Number1[i]);
num1[i].setFont(new Font("华文行楷",Font.BOLD,25));
jp1.add(num1[i]);
num1[i].setForeground(Color.WHITE);
num1[i].setBackground(Color.GRAY);
}
JPanel jp2 = new JPanel();
jp2.setLayout(new GridLayout(2,1,3,3));//用网格布局器,2行1列,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
for(int j=0;j<Number2.length;j++){
num2[j] = new JButton(Number2[j]);
num2[j].setFont(new Font("华文行楷",Font.BOLD,25));
jp2.add(num2[j]);
num2[j].setForeground(Color.WHITE);
num2[j].setBackground(Color.GRAY);
}
JPanel jp3 = new JPanel(); // 将两个按钮面板放在同一个面板里
jp3.setLayout(new BorderLayout(3,3)); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素
jp3.add("West",jp1);
jp3.add("East",jp2);
JPanel top = new JPanel(); // 显示框与所有按钮面板放置在同一面板上
top.setLayout(new BorderLayout());
top.add("Center",result);
getContentPane().setLayout(new BorderLayout(3,3));
getContentPane().add("North", top);
getContentPane().add("Center", jp3);
/**
* 为各按钮添加事件侦听器
*/
for(int i = 0;i<Number1.length;i++){
num1[i].addActionListener(this);
}
for(int j = 0;j<Number2.length;j++){
num2[j].addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String detail = e.getActionCommand();
//实现删除键时间监听
if(detail.equals(Number2[0])) {
String text = result.getText();
int i = text.length();
if(i>0) {
text = text.substring(0, i-1);//字符串截取,剔除末尾
if(text.length() == 0) {//字符串长度为0时与归零无异
result.setText("0");
firstNumber = true;
symbol = "=";
}
else {
result.setText(text);
}
}
//实现归零键事件监听
}else if(detail.equals(Number2[1])) {
result.setText("0");
firstNumber = true;
symbol = "=";
//实现基本数字键事件监听,调用Dealwith1()函数
}else if(".0123456789".indexOf(detail)!=-1) {
Dealwith1(detail);
}else {
Dealwith2(detail);
}
}
private void Dealwith1(String detail) {
// TODO Auto-generated method stub
if(firstNumber) {
result.setText(detail);
}else if ((detail.equals(".")) && (result.getText().indexOf(".")==-1 )) {
result.setText(result.getText() + ".");
}else if(!detail.equals(".")) {
result.setText(result.getText() + detail);
}
firstNumber = false;
}
private void Dealwith2(String detail) {
// TODO Auto-generated method stub
switch(symbol) {
case"+":{
String x = String.valueOf(resultNumber);
String y = String.valueOf(getNext());
BigDecimal a = new BigDecimal(x);
BigDecimal b = new BigDecimal(y);
BigDecimal c = a.add(b);
resultNumber = c.doubleValue();
};break;
case"-":{
String x = String.valueOf(resultNumber);
String y = String.valueOf(getNext());
BigDecimal a = new BigDecimal(x);
BigDecimal b = new BigDecimal(y);
BigDecimal c = a.subtract(b);
resultNumber = c.doubleValue();
};break;
case"*":{
String x = String.valueOf(resultNumber);
String y = String.valueOf(getNext());
BigDecimal a = new BigDecimal(x);
BigDecimal b = new BigDecimal(y);
BigDecimal c = a.multiply(b);
resultNumber = c.doubleValue();
};break;
case"/":{
if(getNext()==0.0) {
Flag = false;
result.setText("Error");
}
else {
resultNumber /= getNext();
}
};break;
case"(-)":
resultNumber = resultNumber*(-1);break;
case"x^2":
resultNumber = Math.pow(resultNumber, 2);break;
case"x^3":
resultNumber = Math.pow(resultNumber, 3);break;
case"mod":{
if(getNext()==0.0) {
Flag = false;
result.setText("Error");
}
else {
String x = String.valueOf(resultNumber);
String y = String.valueOf(getNext());
BigDecimal a = new BigDecimal(x);
BigDecimal b = new BigDecimal(y);
BigDecimal[] c = a.divideAndRemainder(b);
resultNumber = c[1].doubleValue();
}
};break;
case"1/x":{
if(resultNumber == 0.0) {
Flag =false;
result.setText("Error");
}else {
resultNumber = 1/resultNumber;
}
};break;
case"√":{
if(resultNumber < 0) {
Flag = false;
result.setText("Error");
}else {
resultNumber = Math.sqrt(resultNumber);
}
};break;
case"sin":
resultNumber = Math.sin(resultNumber);break;
case"cos":
resultNumber = Math.cos(resultNumber);break;
case"tan":
resultNumber = Math.tan(resultNumber);break;
case"ln":{
if(resultNumber <= 0) {
Flag = false;
result.setText("Error");
}else {
resultNumber = Math.log(resultNumber);
}
};break;
case"log":{
if(resultNumber <= 0) {
Flag = false;
result.setText("Error");
}else {
resultNumber = Math.log10(resultNumber);
}
};break;
case"D->B":{
int a = (int)resultNumber;
String b = Integer.toBinaryString(a);
resultNumber = Double.valueOf(b).doubleValue();
};break;
case"D->O":{
int a = (int)resultNumber;
String b = Integer.toOctalString(a);
resultNumber = Double.valueOf(b).doubleValue();
};break;
case"!":{
if(resultNumber < 0||(resultNumber%2!=0&&resultNumber%2!=1)) {
Flag = false;
result.setText("Error");
}else {
resultNumber = factorial(resultNumber);
}
};break;
case"=":{
resultNumber = getNext();
};break;
}
if (Flag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) resultNumber;
t2 = resultNumber - t1;
if (t2 == 0) {
result.setText(String.valueOf(t1));
} else {
result.setText(String.valueOf(resultNumber));
}
try {
String a = String.valueOf(resultNumber);
FileOutputStream out_one;
out_one = new FileOutputStream("data.txt");
DataOutputStream d= new DataOutputStream(out_one);
try {
d.writeChars(a);
d.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
symbol = detail;
firstNumber = true;
Flag = true;
}
private double factorial(double resultNumber2) {
// TODO Auto-generated method stub
if(resultNumber2==0)
return 1;
else
return resultNumber2*factorial(resultNumber2-1);
}
private double getNext() {
double r = 0;
try {
r = Double.valueOf(result.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return r;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Calculator().setVisible(true);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。