import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import javax.swing.*; |
import java.awt.*; |
import java.math.BigDecimal; |
import java.math.MathContext; |
import java.math.RoundingMode; |
import java.awt.Color; |
/** |
* java版计算器 |
*/ |
public class Calculator extends JFrame { |
final int WIN_W = 250 , WIN_H = 250 ; |
JPanel myPanel, panelSuper; |
public Calculator() { |
// 主面板 |
panelSuper = new JPanel(); |
panelSuper.setLayout( null ); |
// 设置窗口位置 |
double width = Toolkit.getDefaultToolkit().getScreenSize().width; |
double height = Toolkit.getDefaultToolkit().getScreenSize().height; |
this .setBounds(( int ) (width - WIN_W) / 2 , ( int ) (height - WIN_H) / 2 , |
WIN_W, WIN_H); |
// 窗口配置 |
this .setTitle( "java版计算器" ); |
this .validate(); |
this .setResizable( false ); |
this .setVisible( true ); |
this .setDefaultCloseOperation(DISPOSE_ON_CLOSE); |
// 添加计算器按钮面板 |
myPanel = new MyPanel(); |
this .add(myPanel, BorderLayout.CENTER); |
} |
public static void main(String[] args) { |
new Calculator(); |
} |
/** |
* 计算器按钮面板类 |
*/ |
class MyPanel extends JPanel implements ActionListener { |
JButton button1, button2, button3, button4, button5, button6, button7, |
button8, button9, button0, buttonJia, buttonJian, buttonCheng, |
buttonChu, buttonDeng, buttonDian, buttonC, buttonDel, |
buttonZF, buttonGH; |
JTextField jTextField; // 计算器显示屏 |
char oper; // 操作符 |
String key, allKey = "1234567890.±del" , jjccKey = "+-*/" ; |
BigDecimal d1, d2; |
boolean first; |
public MyPanel() { |
// 设置布局 |
this .setLayout( new FlowLayout(FlowLayout.LEFT, 4 , 5 )); |
// 计算器显示屏 |
jTextField = new JTextField( 21 ); |
jTextField.setHorizontalAlignment(JTextField.RIGHT); |
jTextField.setEditable( false ); |
jTextField.setBackground( new Color( 255 , 255 , 255 )); |
jTextField.setText( "0" ); |
this .add(jTextField); |
// 计算器按钮 |
button1 = new JButton( "1" ); |
button2 = new JButton( "2" ); |
button3 = new JButton( "3" ); |
button4 = new JButton( "4" ); |
button5 = new JButton( "5" ); |
button6 = new JButton( "6" ); |
button7 = new JButton( "7" ); |
button8 = new JButton( "8" ); |
button9 = new JButton( "9" ); |
button0 = new JButton( "0" ); |
buttonJia = new JButton( "+" ); |
buttonJian = new JButton( "-" ); |
buttonCheng = new JButton( "*" ); |
buttonChu = new JButton( "/" ); |
buttonDeng = new JButton( "=" ); |
buttonDian = new JButton( "." ); |
buttonDel = new JButton( "del" ); |
buttonC = new JButton( "c" ); |
buttonZF = new JButton( "±" ); |
buttonGH = new JButton( "√" ); |
button1.setPreferredSize( new Dimension( 55 , 30 )); |
button2.setPreferredSize( new Dimension( 55 , 30 )); |
button3.setPreferredSize( new Dimension( 55 , 30 )); |
button4.setPreferredSize( new Dimension( 55 , 30 )); |
button5.setPreferredSize( new Dimension( 55 , 30 )); |
button6.setPreferredSize( new Dimension( 55 , 30 )); |
button7.setPreferredSize( new Dimension( 55 , 30 )); |
button8.setPreferredSize( new Dimension( 55 , 30 )); |
button9.setPreferredSize( new Dimension( 55 , 30 )); |
button0.setPreferredSize( new Dimension( 55 , 30 )); |
buttonJia.setPreferredSize( new Dimension( 55 , 30 )); |
buttonJian.setPreferredSize( new Dimension( 55 , 30 )); |
buttonCheng.setPreferredSize( new Dimension( 55 , 30 )); |
buttonChu.setPreferredSize( new Dimension( 55 , 30 )); |
buttonDeng.setPreferredSize( new Dimension( 55 , 30 )); |
buttonDian.setPreferredSize( new Dimension( 55 , 30 )); |
buttonDel.setPreferredSize( new Dimension( 55 , 30 )); |
buttonC.setPreferredSize( new Dimension( 55 , 30 )); |
buttonZF.setPreferredSize( new Dimension( 55 , 30 )); |
buttonGH.setPreferredSize( new Dimension( 55 , 30 )); |
this .add(buttonDel); |
this .add(buttonC); |
this .add(buttonZF); |
this .add(buttonGH); |
this .add(button1); |
this .add(button2); |
this .add(button3); |
this .add(buttonJia); |
this .add(button4); |
this .add(button5); |
this .add(button6); |
this .add(buttonJian); |
this .add(button7); |
this .add(button8); |
this .add(button9); |
this .add(buttonCheng); |
this .add(button0); |
this .add(buttonDian); |
this .add(buttonDeng); |
this .add(buttonChu); |
buttonDel.addActionListener( this ); |
buttonC.addActionListener( this ); |
buttonZF.addActionListener( this ); |
buttonGH.addActionListener( this ); |
button1.addActionListener( this ); |
button2.addActionListener( this ); |
button3.addActionListener( this ); |
button4.addActionListener( this ); |
button5.addActionListener( this ); |
button6.addActionListener( this ); |
button7.addActionListener( this ); |
button8.addActionListener( this ); |
button9.addActionListener( this ); |
button0.addActionListener( this ); |
buttonJia.addActionListener( this ); |
buttonJian.addActionListener( this ); |
buttonCheng.addActionListener( this ); |
buttonChu.addActionListener( this ); |
buttonDeng.addActionListener( this ); |
buttonDian.addActionListener( this ); |
// 计算器初始化 |
init(); |
} |
/** |
* 计算器初始化 |
*/ |
public void init() { |
d1 = new BigDecimal( "0" ); |
d1 = new BigDecimal( "0" ); |
key = "=" ; |
oper = '=' ; |
jTextField.setText( "0" ); |
first = true ; // 用于标记是否进行连续操作(例如按键顺序为“9*9====”,第一次等于first由true变为false,如果!first,按等号相当于用上一次的结果与第二个操作数相乘) |
} |
/** |
* 按钮监听 |
*/ |
public void actionPerformed(ActionEvent e) { |
JButton b = (JButton) e.getSource(); |
if (b == buttonDian) { // 按下. |
jTextField.setText(jTextField.getText() + "." ); |
if (first) { |
d2 = d1 = getNum(); |
} else { |
d2 = getNum(); |
} |
} else if (b == buttonZF) { // 按下± |
BigDecimal d = getNum(); |
d = new BigDecimal( "0" ).subtract(d); |
setFormatNum(d); |
if (first) { |
d2 = d1 = getNum(); |
} else { |
d2 = getNum(); |
} |
} else if (b == buttonDel) { // 按下del |
if (jTextField.getText().length() == 1 |
|| jTextField.getText().length() == 2 |
&& jTextField.getText().startsWith( "-" )) { |
jTextField.setText( "0" ); |
} else { |
String s = jTextField.getText(); |
s = s.substring( 0 , s.length() - 1 ); |
if (s.endsWith( "E+" ) || s.endsWith( "E-" )) |
s = s.substring( 0 , s.length() - 2 ); |
jTextField.setText(s); |
if (first) { |
d2 = d1 = getNum(); |
} else { |
d2 = getNum(); |
} |
} |
} else if (b == buttonC) { // 按下c |
init(); |
} else if (b == buttonJia) { // 按下+ |
BigDecimal s; |
if (!first && allKey.indexOf(key) >= 0 ) { |
if (oper == '-' || oper == '/' ) { |
s = operate(d1, oper, d2); |
} else { |
s = operate(d2, oper, d1); |
} |
setFormatNum(s); |
} // 如果不是第一次,且上一次操作是对数字进行操作 |
else { |
first = false ; |
} |
d2 = d1 = getNum(); |
// System.out.print("111我执行啦\n"); |
oper = '+' ; |
} else if (b == buttonJian) { // 按下- |
BigDecimal s; |
if (!first && allKey.indexOf(key) >= 0 ) { |
s = operate(d1, oper, d2); |
setFormatNum(s); |
} // 如果不是第一次,且上一次操作是对数字进行操作 |
else { |
first = false ; |
} |
d2 = d1 = getNum(); |
oper = '-' ; |
} else if (b == buttonCheng) { // 按下* |
BigDecimal s; |
if (!first && allKey.indexOf(key) >= 0 ) { |
if (oper == '-' || oper == '/' ) { |
s = operate(d1, oper, d2); |
} else { |
s = operate(d2, oper, d1); |
} |
setFormatNum(s); |
} // 如果不是第一次,且上一次操作是对数字进行操作 |
else { |
first = false ; |
} |
d2 = d1 = getNum(); |
oper = '*' ; |
} else if (b == buttonChu) { // 按下/ |
BigDecimal s; |
if (!first && allKey.indexOf(key) >= 0 ) { |
s = operate(d1, oper, d2); |
setFormatNum(s); |
} // 如果不是第一次,且上一次操作是对数字进行操作 |
else { |
first = false ; |
} |
d2 = d1 = getNum(); |
oper = '/' ; |
} else if (b == buttonGH) { // 按下平方根 |
if (jTextField.getText().startsWith( "-" )) { |
init(); |
return ; |
} |
BigDecimal d = getNum(); |
MathContext mc = new MathContext( 10 , RoundingMode.HALF_DOWN); |
d = new BigDecimal(Math.sqrt(d.doubleValue()), mc); |
setFormatNum(d); |
if (first) { |
d2 = d1 = getNum(); |
} else { |
d2 = getNum(); |
} |
} else if (b == buttonDeng) { // 按下= |
BigDecimal s = null ; |
d2 = getNum(); |
if (!key.equals( "=" )) { |
s = operate(d1, oper, d2); |
} else { |
s = operate(d2, oper, d1); |
} |
if (oper != '=' && !key.equals( "=" )) { // 上一次操作为 +-*/ |
d1 = getNum(); |
} |
setFormatNum(s); |
first = true ; |
} else { // 按下其他按钮 |
if ( this .jTextField.getText().equals( "0" ) |
|| allKey.indexOf(key) == - 1 ) { |
this .jTextField.setText(b.getText()); |
} else { |
this .jTextField.setText(jTextField.getText() + b.getText()); |
} |
if (first) { |
d2 = d1 = getNum(); |
} else { |
d2 = getNum(); |
} // d2作被加数:d2+d1 |
} |
key = b.getText(); |
} |
/** |
* 获取操作数 |
* |
* @return 操作数 |
*/ |
public BigDecimal getNum() { |
BigDecimal d = new BigDecimal(jTextField.getText()); |
return d; |
} |
public void setFormatNum(BigDecimal dd) { |
MathContext mc = new MathContext( 18 , RoundingMode.HALF_DOWN); |
BigDecimal d = new BigDecimal(dd.toString(), mc); |
String num = d.toString(); |
if (num.endsWith( ".0" )) |
num = num.replaceAll( "\\.0" , "" ); |
this .jTextField.setText(num); |
} |
/** |
* 计算 |
* |
* @param a1 |
* 操作数1 |
* @param c |
* 操作符 |
* @param a2 |
* 操作数2 |
* @return |
*/ |
public BigDecimal operate(BigDecimal a1, char c, BigDecimal a2) { |
MathContext mc = new MathContext( 10 , RoundingMode.HALF_DOWN); |
switch (c) { |
case '+' : |
return a1.add(a2); |
case '-' : |
return a1.subtract(a2); |
case '*' : |
return a1.multiply(a2); |
case '/' : |
if (a2.compareTo( new BigDecimal( "0" )) == 0 ) { |
init(); |
return new BigDecimal( "0" ); |
} |
return a1.divide(a2, mc); |
default : |
return a2; |
} |
} |
} |
} |