资源描述
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 Test 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","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 ;//面板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 void 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(jm);
}
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);
}
jmb.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 GridLayout(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++) {
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+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.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);
//jf.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();
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 (Exception 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(action);
}else if (jtftext.equals("除数不能为零") ||
jtftext.equals("函数输入无效")) {
//不做任何操作,发出警告声就可以了
}else{
jtf.setText(jtftext + action);//将内容加到原文本框内容的后面
}
isOperator = false;
break;
case 'B'://backspace功能
if (!(jtftext.equals("除数不能为零") ||
jtftext.equals("函数输入无效"))) {
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;
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.parseDouble(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);
}
}
} 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("-" + jtftext);
}
}else{
jtf.setText("0");
}
break;
}
case '-':
case '*':
case '/':
case '%':
case '=':
if (!(jtftext.equals("除数不能为零") ||
jtftext.equals("函数输入无效"))) {
if (oper == '/' && jtftext.equals
("0")) {
jtf.setText("除数不能为零");
} else {
if (ch == '=') {
if (!isOperator) {
try {
d2 =
Double.parseDouble(jtftext);
} catch
(Exception e2) {
// TODO: handle exception
}
} else {
}
jtftext =
Double.toString(operate(d2, oper));
} else {
if (isOperator) {
oper = ch;
break;
} else {
try {
d2 =
Double.parseDouble(jtftext);
} catch
(Exception e2) {
// TODO: handle exception
}
if (ch == '%')
{
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);
}
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;
}
}
}
展开阅读全文