1、package com.cctv; 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.*; //事件监听机制Listener----monitor监听器,侦听器。班长----内部类 //XXXListener-----addXXXListener public class Te
2、st extends JFrame{ String[] str4 = {"编辑","查看","帮助"}; String[] str1 = {"复制","粘贴"}; String[] str2 = {"标准","科学","数字分组"}; String[] str3 = {"帮助主题","关于计算器"}; JMenuBar jmb; JMenu jm; JMenuItem jmi; JFrame jf = new JFrame("我的计算器"); JTextField jtf; private String[] left ={"MC","MR","MS","
3、M+"}; private String[] top ={"Backspace","CE","C"}; private String[] bottom ={ "7","8","9","/","sqrt", "4","5","6","*","%", "1","2","3","-","1/x", "0","+/-",".","+","=" }; private JPanel p1 ;//面板1 左。面板的默认布局管理器是流式布局。 private JPanel p2 ;//面板2 上 private JPanel p3 ;//面板
4、3 主 private JPanel p4;//面板4 private JPanel p5;//面板5 private JButton jb; private double d1 = 0.0; //记录上一步的运算结果值。 private double d2 = 0.0; //记录当前文本框的内容的double值。 private boolean isOperator = false;//记录上次按的是否是运算符键 private char oper = '=';//记录上次运算符 private char ch; public v
5、oid creatMenu(){ //生成一个菜单栏,然后往其中加入菜单, //然后往各菜单中加入相应的菜单选项。 jmb = new JMenuBar(); for (int i = 0; i < str4.length; i++) { jm = new JMenu(str4[i]); if (i == 0) { for (int j = 0; j < str1.length; j++) { jmi = new JMenuItem(str1[j]); jm.add(jmi); } jmb.add(j
6、m); } if (i == 1) { for (int j = 0; j < str2.length; j++) { jmi = new JMenuItem(str2[j]); jm.add(jmi); } jmb.add(jm); } if (i == 2) { for (int j = 0; j < str3.length; j++) { jmi = new JMenuItem(str3[j]); jm.add(jmi); } j
7、mb.add(jm); } } } public void creatFace(){ jf.setLayout(new BorderLayout(15,15));//设置面板的间距 jtf = new JTextField("0");//设置文本框 jtf.setHorizontalAlignment(JTextField.RIGHT); jtf.setEditable(false); jf.add(jtf,BorderLayout.NORTH); //做按钮组 p1 = new JPanel(new GridLayo
8、ut(4,1,5,5));//设置大小间距 for (int i = 0; i < left.length; i++) { jb = new JButton(left[i]); jb.addActionListener(new Monitor());//注册监听 jb.setForeground(Color.RED);//字体设置为红色 p1.add(jb); } p2 = new JPanel(new GridLayout(1,3,5,5)); for (int i = 0; i < top.length; i++) {
9、 jb = new JButton(top[i]); jb.addActionListener(new Monitor()); jb.setForeground(Color.RED); p2.add(jb); } p3 = new JPanel(new GridLayout(4,5,5,5)); for (int i = 0; i < bottom.length; i++) { jb = new JButton(bottom[i]); jb.addActionListener(new Monitor()); if ((i
10、2)%5 == 0 || i == 19) { jb.setForeground(Color.RED);//当按钮符合这条件时,字体设置为红色 }else { jb.setForeground(Color.BLUE);//否则,设置为蓝色 } p3.add(jb); } p4 = new JPanel(new BorderLayout(10,10)); p4.add(new JButton(" "),BorderLayout.NORTH); p4.add(p1); jf.add(p4,BorderLayout.
11、WEST); p5 = new JPanel(new BorderLayout(10,10)); p5.add(p2,BorderLayout.NORTH); p5.add(p3); jf.add(p5,BorderLayout.CENTER); //jf.add(p1,BorderLayout.WEST); } //调用方法 public void init(){ creatMenu(); creatFace(); jf.setJMenuBar(jmb);//建立窗口方法 jf.setVisible(true); //j
12、f.setSize(300,200); jf.pack();//自动调节窗口大小 } public static void main(String[] args) { new Test().init(); } //构造监听器 class Monitor implements ActionListener { public void actionPerformed(ActionEvent e){ String jtftext = jtf.getText(); String action = e.getActionCommand()
13、 double d; ch = action.charAt(0);//按下的按钮的第一个字符 switch (ch) { case '0': case '1': if (action.equals("1/x")) { if (!jtftext.equals("0")) { try { d = Double.parseDouble(jtftext); jtf.setText (Double.toString(1 / d)); } catch (Exceptio
14、n e2) { // TODO: handle exception } }else { jtf.setText("除数不能为零"); } break; } case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (jtftext.equals("0") || isOperator) { jtf.setText(a
15、ction); }else if (jtftext.equals("除数不能为零") || jtftext.equals("函数输入无效")) { //不做任何操作,发出警告声就可以了 }else{ jtf.setText(jtftext + action);//将内容加到原文本框内容的后面 } isOperator = false; break; case 'B'://backspace功能 if (!(jtftext.equals("除数不能为零") || jtftext.equal
16、s("函数输入无效"))) { if (jtftext.length() != 1) { //文本内容不为一时,文本内容长度减一 jtf.setText(jtftext.substring (0, jtftext.length() - 1)); } else { jtf.setText("0"); } } break; case 'C'://C与CE的功能 if (action.equals("C")) { //所有内容清零 d1 = 0;
17、 d2 = 0; isOperator = false; oper = '='; }else if(action.equals("CE")) { } jtf.setText("0"); break; case '.': if (!jtftext.contains(".")) { jtf.setText(jtftext + action); } break; case 's'://开平方根功能 try { d2 = Double.par
18、seDouble(jtftext); if(d2 < 0){ jtf.setText("函数输入无效"); }else { jtftext = Double.toString (Math.sqrt(d2)); if (jtftext.endsWith(".0")) { jtf.setText (jtftext.substring(0,jtftext.length()-2)); }else { jtf.setText(jtftext); } }
19、 } catch (Exception e2) { // TODO: handle exception } break; case '+': if (action.equals("+/-")) { if (Double.parseDouble(jtf.getText())!=0) { if (jtftext.startsWith("-")) { jtf.setText(jtftext.substring(1)); } else { jtf.setText("-" +
20、 jtftext); } }else{ jtf.setText("0"); } break; } case '-': case '*': case '/': case '%': case '=': if (!(jtftext.equals("除数不能为零") || jtftext.equals("函数输入无效"))) { if (oper == '/' && jtftext.equals ("0")) { jtf.setTe
21、xt("除数不能为零"); } else { if (ch == '=') { if (!isOperator) { try { d2 = Double.parseDouble(jtftext); } catch (Exception e2) { // TODO: handle exception } } else { } jtftext = Double.toString(opera
22、te(d2, oper)); } else { if (isOperator) { oper = ch; break; } else { try { d2 = Double.parseDouble(jtftext); } catch (Exception e2) { // TODO: handle exception } if (ch == '%') {
23、 oper = '%'; } jtftext = Double.toString(operate(d2, oper)); oper = ch; } } if (jtftext.endsWith(".0")) { jtf.setText (jtftext.substring(0, jtftext.length() - 2)); } else { jtf.setText(jtftext);
24、 } isOperator = true; } } break; } } //运算方法 public double operate(double d2,char operator){ if (operator == '+') { d1 += d2 ; }else if (operator == '-') { d1 -= d2; }else if (operator == '*') { d1 *= d2; }else if (operator == '/') { d1 /= d2 ; }else if (operator == '%') { d1 =d1*d2/100; }else if (operator == '=') { d1 = d2; } return d1; } } }






