/**
* skw
* 2008-09-11
*/
package com.hust.skw;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class CalculatroFrame extends JFrame implements ActionListener,KeyListener{
private JMenuBar myB = new JMenuBar();//菜单栏
private JMenu menu1, menu2;//菜单
private char ch; //存储字符串中取得的一个字符
private boolean ft1 = false; //标志小数点
private boolean ft2 = false; //标志符号位
private double firstNum = 0; //存储输入运算符前的数据
private double operationNum=0.0;//用于进行一元运算
private double nextNum = 0; //存储输入运算符后的数据
private double nextNum0=0;//用来存储连续=运算时的第二个数
private double resultNum = 0; //算得最终浮点型结果
private double next=0;//用来处理连续运算的数
private String ys="";//用来存放连续运算的第一个运算符
private String ysf="";//用来存放连续按=之前的运算符
private String yunsuanfu = new String(); //存储输入的运算符
private String linshiStr = new String(); //存储临时的字符串
private String resultStr = new String(); //存储算得的最终字符串型结果
private String ss = new String(); //存储鼠标点击的按钮标号
private String fuzhi = new String(); //存储复制的字符串
private String fuzhi2=new String();//存储连续复制的字符串
private StringBuffer memory = new StringBuffer(20);//StringBuffer为字符串缓冲区
private JTextField shuru;//显示框
private JButton bt1[], bt2[];//按钮数组
private JPanel pa1, pa2;//面板
private GridLayout gri1, gri2;//布局
CalculatroFrame() {
super("计算器");
setBackground(Color.lightGray);//设置窗口背景色
setLocation(400,400);//设置面板的位置
setSize(320,260);//设置窗口的大小
setResizable(false);//定义面板大小为固定
setLayout(new BorderLayout());
setJMenuBar(myB);
menu1 = new JMenu("编辑(E)");
//为菜单设置快捷键Alt+E
menu1.setMnemonic('E');
//三个菜单项
JMenuItem menu11 = new JMenuItem("复制");
JMenuItem menu12 = new JMenuItem("粘贴");
JMenuItem menu13 = new JMenuItem("退出");
//为菜单项设置快捷键
KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK);
//复制 Ctrl+C
menu11.setAccelerator(ks1);
KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK);
//粘贴 Ctrl+V
menu12.setAccelerator(ks2);
KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK);
//退出 Ctrl+X
menu13.setAccelerator(ks3);
//为三个菜单项添加按钮事件监听器
menu11.addActionListener(this);
menu12.addActionListener(this);
menu13.addActionListener(this);
menu1.add(menu11);
menu1.add(menu12);
menu1.add(menu13);
menu1.addActionListener(this);
myB.add(menu1);
menu2 = new JMenu("帮助(H)");
menu2.setMnemonic('H');
JMenuItem menu21 = new JMenuItem("联系作者");
JMenuItem menu22 = new JMenuItem("版本声明");
//为菜单项设置快捷键
KeyStroke ks4 = KeyStroke.getKeyStroke(KeyEvent.VK_L, InputEvent.CTRL_MASK);
menu21.setAccelerator(ks4);
KeyStroke ks5 = KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK);
menu22.setAccelerator(ks5);
menu21.addActionListener(this);
menu22.addActionListener(this);
menu2.add(menu21);
menu2.add(menu22);
menu2.addActionListener(this);
myB.add(menu2);
shuru = new JTextField("0",24);
shuru.setHorizontalAlignment(JTextField.RIGHT);//设置文本的对其方式
shuru.setEditable(false);//设置文本不可修改
add(shuru);
shuru.addActionListener(this);
//各个面板的网格布局
gri1 = new GridLayout(1, 5, 3, 0);
pa1 = new JPanel();
pa1.setLayout(gri1);
gri2 = new GridLayout(4, 6, 3,2);
pa2 = new JPanel();
pa2.setLayout(gri2);
bt2 = new JButton[24];
String k2[] = {"MC","7", "8", "9", "+", "Sqrt","MR", "4", "5", "6", "-", "%","MS",
"1", "2", "3", "*", "1/x","M+", "0", "+/-", ".", "/", "=" };
for (int i = 0; i < 24; i++) {
bt2[i] = new JButton(k2[i]);
bt2[i].setMargin(new Insets(3,3,3,3));
pa2.add(bt2[i]);
if (i==0||i == 4 || i == 6 || i == 10 || i == 12 || i == 16||i==18||i==22||i==23)
bt2[i].setForeground(Color.red);//设置按钮上字体的颜色
else
bt2[i].setForeground(Color.blue);//设置按钮上字体的颜色
bt2[i].addActionListener(this);
}
bt1 = new JButton[4];
String k1[] = {"","Backspace", "CE","C"};
for (int i=0; i <4; i++) {
bt1[i] = new JButton(k1[i]);
bt1[i].setMargin(new Insets(3,3,3,3));
bt1[i].setForeground(Color.red);//设置按钮上字体的颜色
pa1.add(bt1[i]);
bt1[i].addActionListener(this);
}
bt1[0].setForeground(Color.black);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
//定义键盘事件
addKeyListener(this);
add(shuru, BorderLayout.NORTH);
add(pa1, BorderLayout.CENTER);
add(pa2, BorderLayout.SOUTH);
pack();
setVisible(true);
}
//处理按钮事件
public void actionPerformed(ActionEvent e) {
ss = e.getActionCommand();//存储所按按钮的标识
//声明版本
if (ss.equals("版本声明"))
new AboutCalculator(this).setVisible(true);
//联系作者
if (ss.equals("联系作者"))
new ContactAuthor(this).setVisible(true);
//单击菜单"复制"选项,复制当前文本框数据
if (ss.equals("复制"))
fuzhi = shuru.getText();
//单击菜单"粘贴"选项,将复制的数据置入文本框中
if (ss.equals("粘贴")){
fuzhi2+=fuzhi;
shuru.setText(fuzhi2);
}
//单击菜单"退出"选项,结束小程序
if (ss.equals("退出"))
System.exit(0);
if(ss.equals("MC"))
{ //如果是MC则清除缓冲区
String temp="";
memory.replace(0,memory.length(),temp);
bt1[0].setText(" ");
}
else if(ss.equals("MR"))
{ //如果按键为MR则恢复缓冲区的数到文本框
if(memory.toString().equals("")){
shuru.setText("0");
}else{
shuru.setText(memory.toString());
}
}
else if(ss.equals("MS"))
{//如果按键为MS则将文本框的数存入缓冲区
String s1=shuru.getText();
memory.replace(0,memory.length(),s1);
//replace(int start, int end, String str)
bt1[0].setText("M");
}
else if(ss.equals("M+"))
{ //如果按键为MS则将文本框值与缓冲区的数相加但不显示结果。
String temp1=shuru.getText();
double dtemp=Double.parseDouble(temp1);
String temp2=memory.toString();
dtemp+=Double.parseDouble(temp2);
temp1=String.valueOf(dtemp);
memory.replace(0,memory.length(),temp1);
}
//开平方
try {
if (ss.equals("Sqrt")) {
linshiStr = shuru.getText();//首先取得文本框中的数据
operationNum=Double.parseDouble(linshiStr);//转换成double型
if (operationNum < 0)
throw new FuShu();
else{
operationNum = Math.sqrt(operationNum);//取平方根
resultStr = Double.toString(operationNum);
shuru.setText(resultStr);
//firstNum = resultNum;
}
}
} catch (FuShu ee) {
shuru.setText(ee.toString());
resultStr = shuru.getText();
}
//利用循环将当前字符串中的最后一个字母删除
if (ss.equals("Backspace")) {
linshiStr = shuru.getText();//首先取得文本框中的数据
if (!resultStr.equals(linshiStr)) {//计算所得到的结果不能进行此运算
shuru.setText("");
//比如现在有个数123,我们先设shuru="";经过下面的循环之后shuru="12"
for (int i = 0; i < linshiStr.length() - 1; i++) {
ch = linshiStr.charAt(i);
shuru.setText(shuru.getText() + ch);
}
if (shuru.getText().equals("-")|| shuru.getText().equals("-0.")||shuru.getText().equals("0")
||shuru.getText().equals("0.0")||shuru.getText().equals("-0.0")||shuru.getText().equals("")) {
shuru.setText("0");
linshiStr = null;
}
}
}
//求一个数的倒数
try {
if (ss.equals("1/x")) {
linshiStr = shuru.getText();
operationNum = Double.parseDouble(linshiStr);
if(operationNum==0){
throw new DaoShu();
}else{
operationNum = 1 / operationNum;
//一元
评论0
最新资源