import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.MathContext;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JMenu;
import java.util.ArrayList;
import java.awt.Font;
public class MainClass extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JMenuItem menuItemM;
private JMenuItem menuItemAbout;
private JMenu menuEdit;
private JMenu menuHelp;
private JMenu menuLook;
private JMenuBar menuBar;
private JPanel contentPane;
private JTextField textField1;
private JTextField textFieldOp;
private JTextField textField2;
private ArrayList<BigDecimal>mList = null;
private BigDecimal num1=null;
private BigDecimal num2=null;
private String operator=null;
private JFrame FrameAbout = null;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainClass frame = new MainClass();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public MainClass() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 429, 532);
menuBar = new JMenuBar();
setJMenuBar(menuBar);
menuLook = new JMenu("\u67E5\u770B");
menuBar.add(menuLook);
menuEdit = new JMenu("\u7F16\u8F91");
menuBar.add(menuEdit);
menuHelp = new JMenu("\u5E2E\u52A9");
menuBar.add(menuHelp);
menuItemM = new JMenuItem("M");
menuLook.add(menuItemM);
menuItemM.addActionListener(this);
menuItemAbout = new JMenuItem("关于");
menuHelp.add(menuItemAbout);
menuItemAbout.addActionListener(this);
menuItemAbout.setActionCommand("About");
contentPane = new JPanel();
contentPane.setBackground(SystemColor.activeCaption);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField1 = new JTextField();
textField1.setFont(new Font("黑体", Font.BOLD, 20));
textField1.setHorizontalAlignment(SwingConstants.RIGHT);
textField1.setBounds(0, 0, 418, 39);
contentPane.add(textField1);
textField1.setColumns(10);
textFieldOp = new JTextField();
textFieldOp.setFont(new Font("黑体", Font.BOLD, 20));
textFieldOp.setHorizontalAlignment(SwingConstants.RIGHT);
textFieldOp.setColumns(10);
textFieldOp.setBounds(0, 38, 418, 39);
contentPane.add(textFieldOp);
textField2 = new JTextField();
textField2.setFont(new Font("黑体", Font.BOLD, 20));
textField2.setHorizontalAlignment(SwingConstants.RIGHT);
textField2.setColumns(10);
textField2.setBounds(0, 75, 418, 39);
contentPane.add(textField2);
JButton buttonMC = new JButton("MC");
buttonMC.setBounds(0, 174, 72, 29);
contentPane.add(buttonMC);
buttonMC.addActionListener(this);
buttonMC.setActionCommand("MC");
JButton buttonMR = new JButton("MR");
buttonMR.setBounds(82, 174, 72, 29);
contentPane.add(buttonMR);
buttonMR.addActionListener(this);
buttonMR.setActionCommand("MR");
JButton buttonMS = new JButton("MS");
buttonMS.setBounds(167, 174, 72, 29);
contentPane.add(buttonMS);
buttonMS.addActionListener(this);
buttonMS.setActionCommand("MS");
JButton buttonMadd = new JButton("M+");
buttonMadd.setBounds(254, 174, 72, 29);
contentPane.add(buttonMadd);
buttonMadd.addActionListener(this);
buttonMadd.setActionCommand("M+");
JButton buttonMsub = new JButton("M-");
buttonMsub.setBounds(341, 174, 72, 29);
contentPane.add(buttonMsub);
buttonMsub.addActionListener(this);
buttonMsub.setActionCommand("M-");
JButton buttonDelete = new JButton("<=");
buttonDelete.setBounds(0, 218, 72, 29);
contentPane.add(buttonDelete);
buttonDelete.addActionListener(this);
buttonDelete.setActionCommand("<=");
JButton buttonCE = new JButton("CE");
buttonCE.setBounds(82, 218, 72, 29);
contentPane.add(buttonCE);
buttonCE.addActionListener(this);
buttonCE.setActionCommand("CE");
JButton buttonC = new JButton("C");
buttonC.setBounds(167, 218, 72, 29);
contentPane.add(buttonC);
buttonC.addActionListener(this);
buttonC.setActionCommand("C");
JButton buttonAddSub = new JButton("\u00B1");
buttonAddSub.setBounds(254, 218, 72, 29);
contentPane.add(buttonAddSub);
buttonAddSub.addActionListener(this);
buttonAddSub.setActionCommand("AddSub");
JButton buttonSqrt = new JButton("\u221A\uFFE3");
buttonSqrt.setBounds(341, 218, 72, 29);
contentPane.add(buttonSqrt);
buttonSqrt.addActionListener(this);
buttonSqrt.setActionCommand("Sqrt");
JButton button7 = new JButton("7");
button7.setBounds(0, 262, 72, 29);
contentPane.add(button7);
button7.addActionListener(this);
button7.setActionCommand("7");
JButton button8 = new JButton("8");
button8.setBounds(82, 262, 72, 29);
contentPane.add(button8);
button8.addActionListener(this);
button8.setActionCommand("8");
JButton button9 = new JButton("9");
button9.setBounds(167, 262, 72, 29);
contentPane.add(button9);
button9.addActionListener(this);
button9.setActionCommand("9");
JButton buttonDiv = new JButton("/");
buttonDiv.setBounds(254, 262, 72, 29);
contentPane.add(buttonDiv);
buttonDiv.addActionListener(this);
buttonDiv.setActionCommand("/");
JButton buttonMod = new JButton("%");
buttonMod.setBounds(341, 262, 72, 29);
contentPane.add(buttonMod);
buttonMod.addActionListener(this);
buttonMod.setActionCommand("%");
JButton button4 = new JButton("4");
button4.setBounds(0, 306, 72, 29);
contentPane.add(button4);
button4.addActionListener(this);
button4.setActionCommand("4");
JButton button5 = new JButton("5");
button5.setBounds(82, 306, 72, 29);
contentPane.add(button5);
button5.addActionListener(this);
button5.setActionCommand("5");
JButton button6 = new JButton("6");
button6.setBounds(167, 306, 72, 29);
contentPane.add(button6);
button6.addActionListener(this);
button6.setActionCommand("6");
JButton buttonMul = new JButton("*");
buttonMul.setBounds(254, 306, 72, 29);
contentPane.add(buttonMul);
buttonMul.addActionListener(this);
buttonMul.setActionCommand("*");
JButton buttonInverse = new JButton("1/x");
buttonInverse.setBounds(341, 306, 72, 29);
contentPane.add(buttonInverse);
buttonInverse.addActionListener(this);
buttonInverse.setActionCommand("1/x");
JButton button1 = new JButton("1");
button1.setBounds(0, 350, 72, 29);
contentPane.add(button1);
button1.addActionListener(this);
button1.setActionCommand("1");
JButton button2 = new JButton("2");
button2.setBounds(82, 350, 72, 29);
contentPane.add(button2);
button2.addActionListener(this);
button2.setActionCommand("2");
JButton button3 = new JButton("3");
button3.setBounds(167, 350, 72, 29);
contentPane.add(button3);
button3.addActionListener(this);
button3.setActionCommand("3");
JButton buttonSub = new JButton("-");
buttonSub.setBounds(254, 350, 72, 29);
contentPane.add(buttonSub);
buttonSub.addActionListener(this);
buttonSub.setActionCommand("-");
JButton button0 = new JButton("0");
button0.setBounds(0, 394, 154, 29);
contentPane.add(button0);
button0.addActionListener(this);
button0.setActionCommand("0");
JButton buttonPoint = new JButton(".");
buttonPoint.setBounds(167, 394, 72, 29);
contentPane.add(buttonPoint);
buttonPoint.addActionListener(this);
buttonPoint.setActionCommand(".");
JButton buttonAdd = new JButton("+");
buttonAdd.setBounds(254, 394, 72, 29);
contentPane.add(buttonAdd);
buttonAdd.addActionListener(this);
buttonAdd.setActionCommand("+");
JButton buttonEqual = new JButton("=");
buttonEqual.setBounds(341, 350, 72, 73);
contentPane.add(buttonEqual);
buttonEqual.addActionListener(this);
buttonEqual.setActionCommand("=");
num1 = BigDecimal.ZERO;
num2 = BigDecimal.ZERO;
mList = new ArrayList<BigDecimal>();
textField2.setText("0");
textField1.setEditable(false);
textFieldOp.setEditable(false);
textField2.setEditable(false);
}
public void actionPerformed(ActionEvent e)
{
JButton button = null;
JMenuItem menuItem = null;
String command =null;
try
{
button = (JButton)e.getSource();
command = button.getActionCommand();
}catch(Exception exception)
{
try
{
menuItem = (JMenuItem)e.getSource();
command = menuItem.getActionCommand();
}catch(Exception ex)
{
}
}
switch(command)
{
case "0":
String text = textField2.getText();
int len = text.length();
if(len==1&&text.equals("0"))
{
//do nothing
}
else if(len<20)
{
textField2.setText(text+"0");
}
break;
case "1":case "2":case "3":case "4":case "5":case "6":case "7":case "8":case "9":
text = textField2.getText();
len = text.length();
if(len==1 && text.equals("0"))
{
textField2.setText(command);
}
else if(len<20)
{
textField2.setText(text+command);
}
else
{
JOptionPane.showMessageDialog(null, "数据过大");
}
break;
case "MC":
mList.clear();
break;
case "MR":
int size = mList.size();
if(size==0)
{
JOptionPane.showMessageDialog(null, "内存中没有保存数据");
}
else
{
textField2.setText(mList.get(size-1).toString());
}
break;
case "MS":
try
{
BigDecimal num = new BigDecimal(textField2.getText());
mList.add(num);
}catch(Exception exception)
{
JOptionPane.showMessageDialog(null, "输入的数据错误,请重新输入");
textField2.setText("0");
}
break;
case "M+":
size = mList.size();
if(size==0)
{
try
{
BigDecimal num = new BigDecimal(textField2.getText());
mList.add(num);
}catch(Exception exception)
{
System.out.println(exception.toString());
}
}
else
{
try
{
mList.set(size-1, mList.get(size-1).add(new BigDecimal(textField2.getText())));
}catch(Exception exception)
{
System.out.println(exception.toString());
}
}
break;
case "M-":
size = mList.size();
if(size==0)
{
try
{
BigDecimal num = BigDecimal.ZERO.subtract(new BigDecimal(textField2.getText()));
mList.add(num);
}catch(Exception exception)
{
System.out.println(exception.toString());
}
}
else
{
try
{
mList.set(size-1,mList.get(size-1).subtract(new BigDecimal(textField2.getText())));
}catch(Exception exception)
{
System.out.println(exception.toString());
}
}
break;
case "<=":
text = textField2.getText();
len = text.length();
if(len==1)
{
textField2.setText("0");
}
else
{
textField2.setText(text.substring(0, len-1));
}
break;
case "CE":
textField2.setText("0");
break;
case "C":
num1 = BigDecimal.ZERO;
num2 = BigDecimal.ZERO;
textField1.setText("");
textFieldOp.setText("");
textField2.setText("0");
operator = null;
break;
case "AddSub":
text = textField2.getText();
try
{
num2 = BigDecimal.ZERO.subtract(new BigDecimal(text));
textField2.setText(num2.toString());
}catch(Exception exception)
{
JOptionPane.showMessageDialog(null, "输入的数据错误,请重新输入");
textField2.setText("0");
}
break;
case "Sqrt":
try
{
text = textField2.getText();
num2 = new BigDecimal(text);
if(num2.compareTo(BigDecimal.ZERO)<0)
{
System.out.println("被开方数小于0");
JOptionPane.showMessageDialog(null, "被开方数小于0");
}
else
{
try
{
num2 = sqrt(num2);
}catch(Exception exception)
{
System.out.println(exception.toString());
}
textField2.setText(num2.toString());
}
}catch(Exception exception)
{
}
break;
case "/":
textFieldOp.setText("/"); //设置当前符号
if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
{
text = textField2.getText();
num2 = BigDecimal.ZERO;
if(operator==null)//如果是表达式的开始,
{
num1 = new BigDecimal(text);
}
else
{
num1 = new BigDecimal(text);
}
operator = "/";
textField1.setText(num1.toString());
textField2.setText("0");
}
else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
{
text = textField2.getText();
num2 = new BigDecimal(text);
num1 = calc(num1,num2,operator);
textField1.setText(num1.toString());
operator = "/";
textField2.setText("0");
}
break;
case "%":
break;
case "*":
textFieldOp.setText("*"); //设置当前符号
if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
{
text = textField2.getText();
num2 = BigDecimal.ZERO;
if(operator==null)//如果是表达式的开始,
{
num1 = new BigDecimal(text);
}
else
{
num1 = new BigDecimal(text);
}
operator = "*";
textField1.setText(num1.toString());
textField2.setText("0");
}
else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
{
text = textField2.getText();
num2 = new BigDecimal(text);
num1 = calc(num1,num2,operator);
textField1.setText(num1.toString());
operator = "*";
textField2.setText("0");
}
break;
case "1/x":
text = textField2.getText();
try
{
num2 = new BigDecimal(text);
if(num2.equals(BigDecimal.ZERO))
{
System.out.println("除数为0");
JOptionPane.showMessageDialog(null, "除数为0");
}
else
{
num2 = BigDecimal.ONE.divide(num2, 18,BigDecimal.ROUND_UP);
String num2Str = num2.toString();
textField2.setText(num2Str);
}
}catch(Exception exception)
{
System.out.println(exception.toString());
//JOptionPane.showMessageDialog(null, "x输入的数据错误,请重新输入");
//textField2.setText(num2.toString());
}
break;
case "-":
textFieldOp.setText("-"); //设置当前符号
if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
{
text = textField2.getText();
num2 = BigDecimal.ZERO;
if(operator==null)//如果是表达式的开始,
{
num1 = new BigDecimal(text);
}
else
{
num1 = new BigDecimal(text);
}
operator = "-";
textField1.setText(num1.toString());
textField2.setText("0");
}
else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
{
text = textField2.getText();
num2 = new BigDecimal(text);
num1 = calc(num1,num2,operator);
textField1.setText(num1.toString());
operator = "-";
textField2.setText("0");
}
break;
case "+":
textFieldOp.setText("+"); //设置当前符号
if(operator==null || operator.equals("="))//如果上一个符号为null,说明这是一个表达式的开始,将当前的textField2内容存入num1
{
text = textField2.getText();
num2 = BigDecimal.ZERO;
if(operator==null)//如果是表达式的开始,
{
num1 = new BigDecimal(text);
}
else
{
num1 = new BigDecimal(text);
}
operator = "+";
textField1.setText(num1.toString());
textField2.setText("0");
}
else //如果上一个符号不是null,说明是一个表达式,进行运算后结果保存在num1中
{
text = textField2.getText();
num2 = new BigDecimal(text);
num1 = calc(num1,num2,operator);
textField1.setText(num1.toString());
operator = "+";
textField2.setText("0");
}
break;
case "=":
if(operator==null)
{
textField1.setText("");
textFieldOp.setText("");
text = textField2.getText();
num2 = new BigDecimal(text);
textField2.setText(num2.toString());
}
else if(operator.equals("="))
{
//do nothing
}
else
{
text = textField2.getText();
num2 = new BigDecimal(text);
num1 = calc(num1,num2,operator);
operator = "=";
textField1.setText("");
textFieldOp.setText("");
textField2.setText(num1.toString());
}
break;
case ".":
text = textField2.getText();
len = text.length();
if(text.charAt(len-1)=='.')
{
//do nothing
}
else if(len<20)
{
boolean have = false;
for(int i=0;i<len;i++)
{
if(text.charAt(i)=='.') have = true;
}
if(have==false)
{
textField2.setText(text+".");
}
else
{
JOptionPane.showMessageDialog(null, "无法继续输入小数点");
}
}
break;
case "M":
size = mList.size();
String store="";
for(int i=size-1;i>=0;i--)
{
store+="\n"+mList.get(i).toString();
}
JOptionPane.showMessageDialog(null, store);
break;
case "About":
//System.out.println("help");
String message = "关于:王功胜牌计算器\n2018/12/13日制造成功!16:07";
int x = this.getBounds().x;
int y = this.getBounds().y;
FrameAbout = new JFrame("帮助关于");
FrameAbout.setBounds(x,y,500,500);
FrameAbout.setVisible(true);
FrameAbout.getContentPane().setLayout(new GridBagLayout ());
JLabel label = new JLabel(message);
label.setFont(new Font("黑体",Font.BOLD,20));
FrameAbout.getContentPane().add(label);
FrameAbout.validate();
break;
}
}
public static BigDecimal sqrt(BigDecimal num) {
if(num.compareTo(BigDecimal.ZERO) < 0) {
return BigDecimal.ZERO;
}
BigDecimal x = num.divide(new BigDecimal("2"), MathContext.DECIMAL128);
while(x.subtract(x = sqrtIteration(x, num)).abs().compareTo(new BigDecimal("0.0000000000000000000001")) > 0);
return x;
}
private static BigDecimal sqrtIteration(BigDecimal x, BigDecimal n) {
return x.add(n.divide(x, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
}
public static BigDecimal calc(BigDecimal x,BigDecimal y,String op)
{
BigDecimal ans = BigDecimal.ZERO;
switch(op)
{
case "+":
ans = x.add(y);
break;
case "-":
ans = x.subtract(y);
break;
case "*":
ans = x.multiply(y);
break;
case "/":
if(y.equals(BigDecimal.ZERO))
{
System.out.println("除数为0");
}
else
{
ans = x.divide(y);
}
break;
}
return ans;
}
}