- package graphics;
- // debuged already ok
- import java.util.Date;
- import java.awt.*;
- import java.awt.event.*;
- import java.text.DecimalFormat;
- import java.text.SimpleDateFormat;
- //++
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- //++
- import javax.swing.*;
- //import javax.swing.event.CaretEvent;
- //import javax.swing.event.CaretListener;
- public class CalculatorX extends JFrame implements ActionListener
- {
- /**
- *
- */
- public File file; //++
- private static final long serialVersionUID = 1L;
- private JButton but[],enter;
- public enum MyOperator{ADD, SUB, MUL, DIV}
- private MyOperator oper;
- private JTextField text_area;
- private double result, last;
- private HelpDialog viewdialog, helpdialog;
- private ClearDialog historydialog;
- ///private String historytext;
- private int flag, operatorflag, numberflag, enterflag;
- public CalculatorX() throws IOException
- {
- super("CalculatorX");
- this.setResizable(false);
- this.setAlwaysOnTop(true);
- this.setBounds(300, 245, 240, 340);
- this.setDefaultCloseOperation(3);
- this.file = new File("cacu_history");
- if(this.file.length() != 0)
- this.writeToFile("/n----------------------" + //怎么才能放在析构函数里
- "--------------------/n/n");
- text_area = new JTextField("0");
- text_area.setEditable(false);
- Dimension mini_size = new Dimension(1000,40);
- text_area.setPreferredSize(mini_size);
- System.out.println("tr"+text_area.getSize().width+"tr"+text_area.getHeight());
- text_area.setFont(new Font("Consolas", 0, 25));//"Default", Font.bold, 20
- text_area.setHorizontalAlignment(JTextField.RIGHT);
- this.getContentPane().add(text_area, BorderLayout.NORTH);
- JPanel jpanel = new JPanel();
- jpanel.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));
- this.getContentPane().add(jpanel); //
- JPanel jpanel_max = new JPanel();
- Dimension jpmax_size = new Dimension(225,141);
- jpanel_max.setPreferredSize(jpmax_size);
- jpanel_max.setLayout(new FlowLayout(FlowLayout.RIGHT,5,7));
- jpanel.add(jpanel_max);
- JPanel jpanel_min = new JPanel();
- Dimension jpmin_size = new Dimension(170,100);
- jpanel_min.setPreferredSize(jpmin_size);
- jpanel_min.setLayout(new FlowLayout(FlowLayout.RIGHT,5,7));
- jpanel.add(jpanel_min);
- JPanel jpanel_enter = new JPanel(new FlowLayout(FlowLayout.RIGHT,5,7));
- Dimension enter_panel_size = new Dimension(55,100);
- jpanel_enter.setPreferredSize(enter_panel_size);
- jpanel.add(jpanel_enter);
- String b[] = {"√", "±", "C", "+", "7", "8", "9", "-", "4", "5", "6",
- // 0 1 2 3 4 5 6 7 8 9 10
- "*", "1", "2", "3", "0", ".", "/"};
- //11 12 13 14 15 16 17
- but = new JButton[b.length];
- for(int i = 0; i<12; i++)
- {
- but[i] = new JButton(b[i]);
- Dimension same_size = new Dimension(50,40);
- but[i].setPreferredSize(same_size);
- if(i > 0)
- but[i].setFont(new Font("Default", 0, 16));
- but[i].addActionListener(this);
- jpanel_max.add(but[i]);
- }
- for(int i = 12; i<18; i++)
- {
- but[i] = new JButton(b[i]);
- Dimension same_size = new Dimension(50,40);
- but[i].setPreferredSize(same_size);
- but[i].setFont(new Font("Default", 0, 16));
- but[i].addActionListener(this);
- jpanel_min.add(but[i]);
- }
- enter = new JButton("=");
- enter.setFont(new Font("Consolas", 0, 25));
- Dimension same_size = new Dimension(50,86);
- enter.setPreferredSize(same_size);
- enter.addActionListener(this);
- jpanel_enter.add(enter);
- addmiiMenu();
- this.setVisible(true);
- helpdialog = new HelpDialog(this, "关于产品", 320, 150);
- viewdialog = new HelpDialog(this, "使用说明", 420, 350);
- historydialog = new ClearDialog(this, "计算记录", 620, 400);
- }
- public void finalize() throws IOException//没有用 待解决
- {
- System.out.print(" finalize() throws IOException ");//NOY
- this.writeToFile("---------------------------" +
- "/n");
- }
- public void addmiiMenu()
- {
- JMenuBar menubar = new JMenuBar();
- this.setJMenuBar(menubar);
- String menustr[] = {"查看", "文件", "帮助(F1)"};
- JMenu menu[] = new JMenu[menustr.length];
- for(int i = 0; i<menustr.length; i++)
- {
- menu[i] = new JMenu(menustr[i]);
- menubar.add(menu[i]);
- }
- JMenuItem menu_view_history = new JMenuItem("查看计算记录");
- menu_view_history.addActionListener(this);
- menu[0].add(menu_view_history);
- JMenuItem menu_help_view = new JMenuItem("查看帮助 ");
- menu_help_view.addActionListener(this);
- menu_help_view.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, InputEvent.CTRL_MASK));
- JMenuItem menu_help_about = new JMenuItem("关于计算器");
- menu_help_about.addActionListener(this);
- menu[2].add(menu_help_view);
- menu[2].addSeparator();
- menu[2].add(menu_help_about);
- menu[2].setMnemonic(KeyEvent.VK_F1);
- }
- public static void main(String args[]) throws IOException
- {
- new CalculatorX();
- }
- private class ClearDialog extends JDialog implements ActionListener
- {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- JFrame jframe;
- JPanel jpanel;
- JTextArea jtexr;
- public JButton clear;
- ClearDialog(JFrame jframe, String st, int wid, int hig)
- {
- super(jframe, st, true);
- this.jframe=jframe; //
- this.setSize(wid,hig);
- jpanel = new JPanel();
- clear = new JButton("删除记录");
- clear.addActionListener(this);
- clear.addActionListener((ActionListener) jframe);
- //this.getContentPane().setLayout(new FlowLayout());
- this.getContentPane().add(jpanel, "North");
- jpanel.setLayout(new FlowLayout(FlowLayout.LEFT));
- jpanel.add(clear);
- jtexr = new JTextArea("");
- jtexr.setEditable(true);
- jtexr.setFont(new Font("仿宋", 1, 15));
- jtexr.setLineWrap(true); //自动换行
- this.getContentPane().add(new JScrollPane(jtexr));
- this.setDefaultCloseOperation(HIDE_ON_CLOSE);
- }
- void show (String message)
- {
- jtexr.setText(message);
- this.setLocation(jframe.getX()+100,jframe.getY()+100);
- this.setVisible(true);
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- if(e.getSource()instanceof JButton)
- {
- jtexr.setText("");
- }
- }
- }
- private class HelpDialog extends JDialog
- {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- JFrame jframe;
- JTextArea jtexr;
- HelpDialog(JFrame jframe, String st, int wid, int hig)
- {
- super(jframe, st, true);
- this.jframe=jframe; //
- this.setSize(wid,hig);
- jtexr = new JTextArea("");
- jtexr.setEditable(false);
- jtexr.setFont(new Font("仿宋", 1, 15));
- jtexr.setLineWrap(true); //自动换行
- //jtexr.setEnabled(false);
- this.getContentPane().add(new JScrollPane(jtexr));
- this.setDefaultCloseOperation(HIDE_ON_CLOSE);
- }
- void show (String message)
- {
- jtexr.setText(message);
- this.setLocation(jframe.getX()+100,jframe.getY()+100);
- this.setVisible(true);
- }
- }
- @Override
- public void actionPerformed(ActionEvent e)
- {
- // TODO Auto-generated method stub
- if(e.getSource() == historydialog.clear)
- {
- this.file.delete();
- this.file = new File("cacu_history");
- }
- DecimalFormat df = new DecimalFormat("#############.#############");
- if(e.getSource()instanceof JMenuItem) //MenuItem
- {
- if(e.getActionCommand()==("查看计算记录"))
- try {
- if(this.file.length()!=0)
- historydialog.show(this.readFromFile());
- else
- historydialog.show("无记录");
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- if(e.getActionCommand()=="查看帮助 ")
- viewdialog.show("实验中" +
- "已经将确认键立起" +
- "/n/n" +
- "解决了小数点移位,使之趋于精确" +
- "/n/n" +
- "解决了无优先级连徐运算 最大长度仍可输入并运算" +
- "/n/n" +
- "可以使用计算器进行如加、减、乘、除这样简单的运算。" +
- "/n/n" +
- "单击“查看”菜单,然后单击所需模式。" +
- "/n/n" +
- "切换模式时,将清除当前的计算。但会保留“记忆钥匙”所存储的计算历史记录和数字。" +
- "/n/n" +
- "单击计算器键进行所需的计算");
- if(e.getActionCommand()=="关于计算器")
- helpdialog.show("/n/n All rights reserved by " +
- "/n Mr Baoning Gai" +
- "/n 11/16/2010");
- }
- if(e.getSource()instanceof JButton)
- {
- if( text_area.getText().equals("Overflow")||text_area.getText().equals("Error : Infinity")||text_area.getText().equals("Error :NaN") )
- Clear();
- if( (text_area.getText().length()-flag)<15||operatorflag==1 )
- {
- if(e.getSource()==but[4])
- {
- Addnumber(7);
- }
- if(e.getSource()==but[5])
- {
- Addnumber(8);
- }
- if(e.getSource()==but[6])
- {
- Addnumber(9);
- }
- if(e.getSource()==but[8])
- {
- Addnumber(4);
- }
- if(e.getSource()==but[9])
- {
- Addnumber(5);
- }
- if(e.getSource()==but[10])
- {
- Addnumber(6);
- }
- if(e.getSource()==but[12])
- {
- Addnumber(1);
- }
- if(e.getSource()==but[13])
- {
- Addnumber(2);
- }
- if(e.getSource()==but[14])
- {
- Addnumber(3);
- }
- if(e.getSource()==but[15])
- {
- Addnumber(0);
- }
- }
- if(e.getSource()==but[16]) //not complement
- {
- try
- {
- Integer.parseInt(text_area.getText());
- flag = 1;
- }
- catch(NumberFormatException nfe)
- {
- System.out.println("!");
- }
- finally{}
- }
- if(e.getSource()==but[3]) //not complement
- {
- if(numberflag == 1&&oper != null)
- try {
- Operate();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- result = Double.parseDouble( text_area.getText() );
- oper = MyOperator.ADD;
- operatorflag = 1;
- numberflag = 0;
- enterflag = 0;//
- }
- if(e.getSource()==but[7]) //not complement
- {
- if(numberflag == 1&&oper != null)
- try {
- Operate();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- result = Double.parseDouble( text_area.getText() );
- oper = MyOperator.SUB;
- operatorflag = 1;
- numberflag = 0;
- enterflag = 0;//
- }
- if(e.getSource()==but[11]) //not complement
- {
- if(numberflag == 1&&oper != null)
- try {
- Operate();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- result = Double.parseDouble( text_area.getText() );
- oper = MyOperator.MUL;
- operatorflag = 1;
- numberflag = 0;
- enterflag = 0;//
- }
- if(e.getSource()==but[17]) //not complement
- {
- if(numberflag == 1&&oper != null)
- try {
- Operate();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- result = Double.parseDouble( text_area.getText() );
- oper = MyOperator.DIV;
- operatorflag = 1;
- numberflag = 0;
- enterflag = 0;// = 之后可以用当前数做前值
- }
- if(e.getSource()==but[0]) //求根
- {
- double a = Double.parseDouble( text_area.getText() );
- if(a<=0)
- {
- text_area.setText("Error :NaN");
- return;
- }
- a = Math.sqrt(a);
- String str = "" + df.format(a);
- try {
- this.writeToFile("sqrt(" + text_area.getText() + ") =" + a + Addtime() + "/n");
- }
- catch (IOException e1) {}
- text_area.setText(str);
- result = Double.parseDouble( text_area.getText() );
- operatorflag = 1;
- }
- if(e.getSource()==but[1]) //not complement
- {
- double a = Double.parseDouble( text_area.getText() );
- a = 0 - a;
- String str = "" + df.format(a);
- text_area.setText(str);
- result = Double.parseDouble( text_area.getText() );
- }
- if(e.getSource()==but[2]) //not complement
- {
- Clear();
- }
- if(e.getSource()==enter&&oper!=null) // complement
- {
- try {
- Operate();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- operatorflag = 1; //仅仅是为了变 0
- enterflag = 1;
- }
- System.out.print(" result="+result);//NOY
- System.out.print(" last="+last);//NOY
- System.out.print(" flag="+flag);//NOY
- System.out.print(" operatorflag="+operatorflag);//NOYoperatorflag
- System.out.print(" numberflag="+numberflag);
- System.out.print(oper); //NOY
- System.out.println("!!!!!!! enterflag="+enterflag);
- }
- }
- public void Clear()
- {
- text_area.setText("0");
- oper = null;
- result = 0;
- operatorflag = 0;
- numberflag = 0;
- }
- public String Pointmove(String str, int len) //小数点移位
- {
- int point_position = str.indexOf(".")+1; //查找小数点的位置
- int point_number = str.length() - point_position;
- int delete_number = str.length() - len; //与小数点无关
- int need_number = point_number - delete_number;
- String str_format = "#";
- if(need_number<0||point_position>15)
- return "Overflow";
- if(need_number>0)
- str_format += ".";
- for(int i=0; i<need_number; i++)
- {
- str_format+="#";
- }
- DecimalFormat df = new DecimalFormat(str_format);
- String st = "" + df.format(Double.parseDouble(str));
- if(st.length()>15)
- return "Overflow"; //因为小数点位置在大于15 或无小数点时仍应控制长度
- return st;
- }
- public String Addtime()
- {
- SimpleDateFormat format_time = new SimpleDateFormat("HH:mm ss,MM/dd/yyyy");
- Date currenttime = new Date();
- String str_time = " time:" + format_time.format(currenttime);
- return str_time;
- }
- public void Addnumber(int getnumber)
- {
- DecimalFormat df = new DecimalFormat("#############.#############");
- String str;
- if(enterflag==1)
- oper = null;
- if(operatorflag==1)
- {
- str = "0";
- operatorflag = 0;
- }
- else
- {
- str = text_area.getText();
- }
- if(flag==1)
- {
- str += ".";
- flag = 0;
- }
- numberflag = 1;
- enterflag = 0;
- str =str+getnumber;
- double input = Double.parseDouble( str );
- str = "" + df.format(input);
- last = input;
- text_area.setText(str);
- System.out.println("click "+getnumber);
- }
- public void Operate() throws IOException
- {
- DecimalFormat df = new DecimalFormat("#############.#############");
- System.out.println("clik enter"); //NOY
- double b = last;
- double a = result;
- String add_history = "";
- switch(oper)
- {
- case ADD :
- add_history =a+"+"+b+"="+(a+b)+Addtime()+"/n";
- a = a+b;
- break;
- case SUB :
- add_history =a+"-"+b+"="+(a+b)+Addtime()+"/n";
- a = a-b;
- break;
- case MUL :
- add_history =a+"*"+b+"="+(a+b)+Addtime()+"/n";
- a = a*b;
- break;
- case DIV :
- a = a/b;
- add_history =a+"/"+b+"="+(a+b)+Addtime()+"/n";
- if(b==0)
- {
- text_area.setText("Error : Infinity");
- return;
- }
- break;
- }
- numberflag = 0;
- result = a;
- String str = "" + df.format(result);
- //++
- this.writeToFile(add_history);
- //++
- if(str.length()<=15)
- {
- text_area.setText(str);
- }
- else
- {
- str = Pointmove(str, 15);
- text_area.setText(str);
- }
- }
- public void writeToFile( String lines ) throws IOException//将字符串lines写入当前文本文件中
- {
- FileWriter fout = new FileWriter(this.file, true);//文件字符流对象
- fout.write(lines); //向文件字符流写入一个字符串
- fout.close();
- }
- public String readFromFile() throws IOException//使用流从当前文本文件中读取字符
- {
- System.out.println("read");
- char lines[] = null;
- FileReader fin = new FileReader( this.file );//创建字符输入流对象
- lines = new char[(int)this.file.length()];
- fin.read(lines); //读取字符流到字符数组
- fin.close();
- return new String(lines);
- }
- }