package calframe; |
|
import java.awt.BorderLayout; |
import java.awt.Color; |
import java.awt.Dimension; |
import java.awt.GridLayout; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import java.util.Arrays; |
|
import javax.swing.JButton; |
import javax.swing.JFrame; |
import javax.swing.JPanel; |
import javax.swing.JTextField; |
|
public class CalFrame extends JFrame { |
/** |
* 计算器的外观设计 |
*/ |
private static final long serialVersionUID = 1L; |
private final static int PRE_WIDTH = 500 ; |
private final static int PRE_HEIGHT = 400 ; |
|
private JTextField text = null ; |
private JButton button = null ; //存储标记 |
|
private String[] nOp = { "7" , "8" , "9" , "/" , "sqrt" , "4" , "5" , "6" , "*" , "%" , "1" , "2" , "3" , "-" , "1/x" , "0" , "+/-" , "." , "+" , "=" }; |
private String[] mOp = { "MC" , "MR" , "MS" , "M+" }; |
private String[] rOp = { "Back" , "CE" , "C" }; |
private CalService service = new CalService(); |
|
public CalFrame(){ |
this .setTitle( "计算器" ); |
this .setSize(PRE_WIDTH, PRE_HEIGHT); |
this .setLocationRelativeTo( null ); |
this .setResizable( false ); |
|
//添加底层 |
JPanel panel = new JPanel(); |
panel.setLayout( new BorderLayout( 10 , 1 )); |
panel.add(getTextField(), BorderLayout.NORTH); |
panel.setPreferredSize( new Dimension(PRE_WIDTH, PRE_HEIGHT)); |
|
//WEST |
JButton[] mButton = getMButton(); |
JPanel panel1 = new JPanel(); |
panel1.setLayout( new GridLayout( 5 , 1 , 0 , 5 )); |
for (JButton b : mButton ){ |
panel1.add(b); |
} |
panel.add(panel1,BorderLayout.WEST); |
// |
JButton[] rButton = getRButton(); |
JPanel panel2 = new JPanel(); |
panel2.setLayout( new BorderLayout( 1 , 5 )); |
JPanel panel21 = new JPanel(); |
panel21.setLayout( new GridLayout( 1 , 3 , 3 , 3 )); |
for (JButton b : rButton){ |
panel21.add(b); |
} |
panel2.add(panel21,BorderLayout.NORTH); |
|
JButton[] nButton = getNButton(); |
JPanel panel22 = new JPanel(); |
panel22.setLayout( new GridLayout( 4 , 5 , 3 , 5 )); |
for (JButton b : nButton){ |
panel22.add(b); |
} |
panel2.add(panel22,BorderLayout.CENTER); |
panel.add(panel2,BorderLayout.CENTER); |
|
this .add(panel); |
this .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); |
this .setVisible( true ); |
|
|
} |
//返回显示框 |
private JTextField getTextField(){ |
text = new JTextField( "0" , 10 ); |
//text.setSize(480, 50); |
return text; |
} |
//返回数字键 |
private JButton[] getNButton(){ |
String[] redButton = { "/" , "*" , "-" , "+" , "=" }; |
JButton[] nbutton = new JButton[nOp.length]; |
for ( int i = 0 ; i < this .nOp.length; i++){ |
JButton b = new JButton( this .nOp[i]); |
b.addActionListener(getActionListener()); |
|
Arrays.sort(redButton); |
if (Arrays.binarySearch(redButton, nOp[i]) >= 0 ){ |
b.setForeground(Color.red); |
} else { |
b.setForeground(Color.blue); |
} |
nbutton[i] = b; |
} |
return nbutton; |
} |
//返回操作健 |
private JButton[] getMButton(){ |
JButton[] mbutton = new JButton[mOp.length + 1 ]; |
mbutton[ 0 ] = getButton(); |
for ( int i = 0 ; i < this .mOp.length; i++){ |
JButton b = new JButton( this .mOp[i]); |
b.addActionListener(getActionListener()); |
b.setForeground(Color.red); |
mbutton[i+ 1 ] = b; |
} |
return mbutton; |
} |
private JButton[] getRButton(){ |
JButton[] rbutton = new JButton[rOp.length]; |
for ( int i = 0 ; i < this .rOp.length; i++){ |
JButton b = new JButton( this .rOp[i]); |
b.addActionListener(getActionListener()); |
b.setForeground(Color.red); |
rbutton[i] = b; |
} |
return rbutton; |
} |
private JButton getButton(){ |
button = new JButton(); |
return button; |
} |
private ActionListener getActionListener(){ |
ActionListener actionListener = new ActionListener() { |
|
@Override |
public void actionPerformed(ActionEvent e) { |
String cmd = e.getActionCommand(); |
String result = null ; |
try { |
result = service.callMethod(cmd, text.getText()); |
} catch (Exception e2) { |
System.out.println(e2.getMessage()); |
} |
if (cmd.indexOf( "MC" ) == 0 ){ |
button.setText( "" ); |
} else if (cmd.indexOf( "M" ) == 0 ){ |
button.setText( "M" ); |
} |
//显示计算结果 |
if (result != null ){ |
text.setText(result); |
} |
|
} |
}; |
return actionListener; |
} |
public static void main(String[] args) { |
new CalFrame(); |
} |
} |
package calframe; |
|
import java.math.BigDecimal; |
|
public class MyMath { |
/** |
* 为一个double类型创建BigDecimal对象 |
*/ |
private static BigDecimal getBigDecimal( double number){ |
return new BigDecimal(number); |
} |
public static double add( double num1, double num2) { |
BigDecimal first = getBigDecimal(num1); |
BigDecimal second = getBigDecimal(num2); |
return first.add(second).doubleValue(); |
} |
public static double subtract( double num1, double num2) { |
BigDecimal first = getBigDecimal(num1); |
BigDecimal second = getBigDecimal(num2); |
return first.subtract(second).doubleValue(); |
} |
public static double multiply( double num1, double num2) { |
BigDecimal first = getBigDecimal(num1); |
BigDecimal second = getBigDecimal(num2); |
return first.multiply(second).doubleValue(); |
} |
public static double divide( double num1, double num2) { |
BigDecimal first = getBigDecimal(num1); |
BigDecimal second = getBigDecimal(num2); |
return first.divide(second, 3 ,BigDecimal.ROUND_HALF_UP).doubleValue(); |
} |
} |
最后处理按钮的事件,我们定义了一个CalService类处理业务逻辑: |
[java] view plain copy |
package calframe; |
|
public class CalService { |
private boolean isSecondNum = false ; |
private String lastOp; |
private String firstNum = "0" ; |
private String secondNum = "null" ; |
private double store; |
private String numString = "0123456789." ; |
private String opString = "+-*/" ; |
|
public String catNum(String cmd, String text) { |
String result = cmd; |
// 如果text不等于0 |
if (! "0" .equals(text)) { |
if (isSecondNum) { |
isSecondNum = false ; |
} else { |
result = text + cmd; |
} |
} |
if (result.indexOf( "." ) == 0 ) { |
result = "0" + result; |
} |
return result; |
} |
|
public String setOp(String cmd, String text) { |
this .lastOp = cmd; |
this .firstNum = text; |
this .secondNum = null ; |
|
this .isSecondNum = true ; |
return null ; |
} |
|
public String cal(String text, boolean isPercent) { |
double secondResult = secondNum == null ? Double.valueOf(text) |
.doubleValue() : Double.valueOf(secondNum).doubleValue(); |
|
//除数为0 |
if (secondResult == 0 && this .lastOp.equals( "/" )){ |
return "0" ; |
} |
|
//有% |
if (isPercent){ |
secondResult = MyMath.multiply(Double.valueOf(firstNum), MyMath.divide(secondResult, 100 )); |
} |
if ( this .lastOp.equals( "+" )){ |
firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum),secondResult)); |
} else if ( this .lastOp.equals( "-" )) { |
firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult)); |
} else if ( this .lastOp.equals( "*" )) { |
firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult)); |
} else if ( this .lastOp.equals( "/" )) { |
firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult)); |
} |
|
secondNum = secondNum == null ? text :secondNum; |
this .isSecondNum = true ; |
return firstNum; |
} |
//求开方 |
public String sqrt(String text){ |
this .isSecondNum = true ; |
return String.valueOf(Math.sqrt(Double.valueOf(text))); |
} |
//求倒数 |
public String setReciprocal(String text){ |
if (text.equals( "0" )){ |
return text; |
} else { |
this .isSecondNum = true ; |
return String.valueOf(MyMath.divide( 1 , Double.valueOf(text))); |
} |
} |
//存储 |
public String mCmd(String cmd,String text){ |
if (cmd.equals( "M+" )){ |
store = MyMath.add(store, Double.valueOf(text)); |
} else if (cmd.equals( "MC" )) { |
store = 0 ; |
} else if (cmd.equals( "MR" )) { |
isSecondNum = true ; |
return String.valueOf(store); |
} else if (cmd.equals( "MS" )) { |
store = Double.valueOf(text).doubleValue(); |
} |
return null ; |
} |
|
public String backSpace(String text){ |
return text.equals( "0" ) || text.equals( "" ) ? "0" :text.substring( 0 ,text.length()- 1 ); |
} |
|
public String setNegative(String text){ |
if (text.indexOf( "-" ) == 0 ){ |
return text.substring( 1 ,text.length()); |
} else { |
return "-" + text; |
} |
} |
public String clearAll(){ |
this .firstNum = "0" ; |
this .secondNum = null ; |
return this .firstNum; |
} |
public String clear(String text){ |
return "0" ; |
} |
|
public String callMethod(String cmd, String text){ |
if (cmd.equals( "C" )){ |
return clearAll(); |
} else if (cmd.equals( "CE" )){ |
return clear(text); |
} else if (cmd.equals( "Back" )) { |
return backSpace(text); |
} else if (numString.indexOf(cmd) != - 1 ) { |
return catNum(cmd, text); |
} else if (opString.indexOf(cmd) != - 1 ) { |
return setOp(cmd, text); |
} else if (cmd.equals( "+/-" )) { |
return setNegative(text); //设置正负号 |
} else if (cmd.equals( "1/x" )){ |
return setReciprocal(text); |
} else if (cmd.equals( "sqrt" )) { |
return sqrt(text); |
} else if (cmd.equals( "%" )){ |
return cal(text, true ); |
} else if (cmd.equals( "=" )){ |
return cal(text, false ); |
} else { |
return mCmd(cmd, text); |
} |
} |
} |