package gui; |
import java.awt.BorderLayout; |
import java.awt.Color; |
import java.awt.GridLayout; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import javax.swing.JButton; |
import javax.swing.JFrame; |
import javax.swing.JPanel; |
import javax.swing.JTextField; |
public class Calculator2 extends JFrame implements ActionListener{ |
//显示的名字 |
private final String[] KEYS={ "7" , "8" , "9" , "/" , "sqrt" , "4" , "5" , "6" , |
"*" , "%" , "1" , "2" , "3" , "-" , "1/x" , "0" , "+/-" , "." , "+" , "=" }; |
private final String[] COMMAND={ "Backspace" , "CE" , "C" }; |
private final String[] M={ "" , "MC" , "MR" , "MS" , "M+" }; |
//按钮 |
private JButton[] keys= new JButton[KEYS.length]; |
private JButton[] command= new JButton[COMMAND.length]; |
private JButton[] m= new JButton[M.length]; |
//计算结果文本框 |
private JTextField resultTxt= new JTextField( "0" ); |
|
//标记用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 |
private boolean firstDigit= true ; |
//计算中间结果 |
private double resultNum= 0.0 ; |
//当前运算的运算符 |
private String operator= "=" ; |
//操作是否合法 |
private boolean operateValidFlag= true ; |
|
/** |
* 构造函数 |
* @param args |
*/ |
|
public Calculator2() { |
// TODO Auto-generated constructor stub |
super (); |
//初始化计算器 |
init(); |
this .setBackground(Color.LIGHT_GRAY); |
this .setTitle( "计算器" ); |
this .setLocation( 500 , 400 ); |
//不许修改计算器大小 |
this .setResizable( false ); |
//是计算器中的各组件大小合适 |
this .pack(); |
} |
/** |
* 初始化计算器 |
*/ |
private void init() { |
// TODO Auto-generated method stub |
//文本框中内容右对齐 |
resultTxt.setHorizontalAlignment(JTextField.RIGHT ); |
//不允许修改结果文本框 |
resultTxt.setEditable( false ); |
//设置文本框背景颜色 |
resultTxt.setBackground(Color.white); |
|
/** |
* 初始化计算器上键的按钮,将键放到一个画板内 |
*/ |
JPanel calkeyPanel= new JPanel(); |
//用网格布局,4X5 网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 |
calkeyPanel.setLayout( new GridLayout( 4 , 5 , 3 , 3 )); |
for ( int i= 0 ;i<KEYS.length;i++){ |
keys[i]= new JButton(KEYS[i]); |
calkeyPanel.add(keys[i]); |
keys[i].setForeground(Color.blue); |
} |
|
//运算符键用红色表示,其他蓝色 |
keys[ 3 ].setForeground(Color.red); |
keys[ 8 ].setForeground(Color.red); |
keys[ 13 ].setForeground(Color.red); |
keys[ 19 ].setForeground(Color.red); |
|
/** |
* 初始化功能键,用红色表示。将功能键放到一个画板内 |
*/ |
JPanel commandPanel= new JPanel(); |
//用网格布局 1X3 |
commandPanel.setLayout( new GridLayout( 1 , 3 , 3 , 3 )); |
for ( int i= 0 ;i<COMMAND.length;i++){ |
command[i]= new JButton(COMMAND[i]); |
commandPanel.add(command[i]); |
command[i].setForeground(Color.red); |
} |
/** |
* 初始化M键,用red表示。将其放到一个面板上 |
*/ |
JPanel mPanel= new JPanel(); |
mPanel.setLayout( new GridLayout( 5 , 1 , 3 , 3 )); |
for ( int i= 0 ;i<M.length;i++){ |
m[i]= new JButton(M[i]); |
mPanel.add(m[i]); |
m[i].setForeground(Color.red); |
} |
|
/** |
* 计算器的整体布局,将calkey和command画板放到计算器的中部 |
* 将文本框放到北部,m画板放到西部 |
*/ |
//新建一个大画板 |
JPanel panel= new JPanel(); |
panel.setLayout( new BorderLayout( 3 , 3 )); |
panel.add( "North" ,commandPanel); |
panel.add( "Center" ,calkeyPanel); |
|
//建立一个画板放文本框 |
JPanel top= new JPanel(); |
top.setLayout( new BorderLayout()); |
top.add( "Center" ,resultTxt); |
//整体布局 |
getContentPane().setLayout( new BorderLayout( 3 , 5 )); |
getContentPane().add( "North" , top); |
getContentPane().add( "Center" , panel); |
getContentPane().add( "West" , mPanel); |
|
//为各个按钮添加监听器 |
//都使用同一个事件监听,即本对象。 |
for ( int i= 0 ;i<KEYS.length;i++){ |
keys[i].addActionListener( this ); |
} |
for ( int i= 0 ;i<COMMAND.length;i++){ |
command[i].addActionListener( this ); |
} |
for ( int i= 0 ;i<M.length;i++){ |
m[i].addActionListener( this ); |
} |
} |
/** |
* 处理事件 |
* @param args |
*/ |
|
@Override |
public void actionPerformed(ActionEvent e) { |
// TODO Auto-generated method stub |
//获取事件源的标签 |
String label=e.getActionCommand(); |
if (label.equals(COMMAND[ 0 ])){ |
handleBackspace(); |
} else if (label.equals(COMMAND[ 1 ])) { |
resultTxt.setText( "0" ); |
} else if (label.equals(COMMAND[ 2 ])) { |
handleC(); |
} else if ( "0123456789." .indexOf(label)>= 0 ) { |
handleNumber(label); |
} else { //用户按了运算符键 |
handleOperator(label); |
} |
} |
private void handleBackspace() { |
// TODO Auto-generated method stub |
String text=resultTxt.getText(); |
int i=text.length(); |
if (i> 0 ){ |
//退格,建文本最后一个字符去掉 |
text=text.substring( 0 , i- 1 ); |
if (text.length()== 0 ){ |
//如果文本没有内容,则初始化计算器的各种值r |
resultTxt.setText( "0" ); |
firstDigit= true ; |
operator= "=" ; |
} else { |
resultTxt.setText(text); //显示新的文本 |
} |
} |
} |
private void handleC() { |
// TODO Auto-generated method stub |
//初始化计算器的各种值 |
resultTxt.setText( "0" ); |
firstDigit= true ; |
operator= "=" ; |
} |
private void handleNumber(String key) { |
// TODO Auto-generated method stub |
if (firstDigit){ |
resultTxt.setText(key); |
} else if ((key.equals( "." ))&&(resultTxt.getText().indexOf( "." ))< 0 ) { |
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 |
resultTxt.setText(resultTxt.getText()+ "." ); |
} else if (!key.equals( "." )) { |
//如果输入的不是小数点,则将数字附在结果文本框的后面 |
resultTxt.setText(resultTxt.getText()+key); |
} |
//以后输入的肯定不的第一个数字了 |
firstDigit= false ; |
} |
private void handleOperator(String key) { |
// TODO Auto-generated method stub |
if (operator.equals( "/" )){ |
//如果当前结果文本框中的值=0 |
if (getNumberFromText()== 0.0 ){ |
//操作不合法 |
operateValidFlag= false ; |
resultTxt.setText( "除数不能为零" ); |
} else { |
resultNum/=getNumberFromText(); |
} |
} else if (operator.equals( "1/x" )) { |
//倒数运算 |
if (resultNum== 0.0 ) { |
//操作不合法 |
operateValidFlag= false ; |
resultTxt.setText( "0没有倒数" ); |
} else { |
resultNum= 1 /resultNum; |
} |
} else if (operator.equals( "+" )) { |
resultNum+=getNumberFromText(); |
} else if (operator.equals( "-" )) { |
resultNum-=getNumberFromText(); |
} else if (operator.equals( "*" )) { |
resultNum*=getNumberFromText(); |
} else if (operator.equals( "sqrt" )) { |
resultNum=Math.sqrt(resultNum); |
} else if (operator.equals( "%" )) { |
resultNum=resultNum/ 100 ; |
} else if (operator.equals( "+/-" )) { |
resultNum=resultNum*(- 1 ); |
} else if (operator.equals( "=" )) { |
resultNum=getNumberFromText(); |
} |
|
if (operateValidFlag) { |
//双精度浮点数的运算 |
long t1; |
double t2; |
t1=( long )resultNum; |
t2=resultNum-t1; |
if (t2== 0 ){ |
resultTxt.setText(String.valueOf(t1)); |
} else { |
resultTxt.setText(String.valueOf(resultNum)); |
} |
} |
//运算符等于用户按的按钮 |
operator=key; |
firstDigit= true ; |
operateValidFlag= true ; |
|
} |
|
//从结果文本中获取数字 |
private double getNumberFromText() { |
// TODO Auto-generated method stub |
double result= 0 ; |
try { |
result=Double.valueOf(resultTxt.getText()).doubleValue(); |
} catch (NumberFormatException e) { |
// TODO: handle exception |
} |
return result; |
} |
public static void main(String[] args) { |
// TODO Auto-generated method stub |
Calculator2 calculator2= new Calculator2(); |
calculator2.setVisible( true ); |
calculator2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
} |
} |
初级程序员
by: 传奇1996 发表于:2017-04-08 14:52:44 顶(0) | 踩(0) 回复
a;dgvn;aerdnvg
回复评论