练手/计算器/GUI/AWT

来源:互联网 发布:网络监察大队图片 编辑:程序博客网 时间:2024/06/07 02:29

两百行左右,实现一个可以 按钮控制,键盘监听控制,可查看历史记录 的四则运算计算器。

/** * 实现运算符字符串的计算类 * @author Gray Xu */class Operator {    //直接调用脚本引擎的方法    private String problem;    static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");     public Operator(String str){        this.problem = str;    }    public Object Operation(){        try{            return jse.eval(problem);        }catch (Exception e) {            return "输入不合法,请检查后再输入!!计算器都不会用,是不是傻。";        }    }}/** * 计算器窗口 * @author Gray Xu * */public class Calculator {    Frame f = new Frame("Simple Calulator!!^_^");    TextArea taMain = new TextArea(2,50);    String[] names = {"1","2","3","+","4","5","6","-","7","8","9","*","0",".","=","/","(",")","Del","Clean"};    boolean CleanWindow = false;    Dialog dHistory = new Dialog(f, "历史记录", true);    TextArea taHistory = new TextArea(5,50);    String strHistory = "";    //把监听器里的计算逻辑封装到函数里    public void doOperation(){        String text = taMain.getText();        String result;        if(text.length()==0){            result="0";        }else{            result = String.valueOf(new Operator(text).Operation());        }        taMain.setText(result);        if(result.equals("输入不合法,请检查后再输入!!计算器都不会用,是不是傻。")){            CleanWindow = true;        }        strHistory = strHistory + text + "=" + result + "\n";    }    public void init(){        //Panel设置为方格的布局        Panel p1 = new Panel();        p1.setLayout(new GridLayout(5,4,4,4));        //添加顶部的文本框        f.add(taMain,BorderLayout.NORTH);        //输入性按钮监听器        ActionListener alInput = new ActionListener() {            public void actionPerformed(ActionEvent e) {                if(CleanWindow == true){                    taMain.setText("");                }                taMain.append(e.getActionCommand());                CleanWindow = false;            }        };        //功能性按钮监听器        ActionListener alFunc = new ActionListener() {            public void actionPerformed(ActionEvent e) {                String button = e.getActionCommand();                if(CleanWindow == true){                    taMain.setText("");                }                if(button.equals("Del")){                    taMain.setText(taMain.getText().substring(0,taMain.getText().length()-1));                }                if(button.equals("Clean")){                    taMain.setText("");                }                if(button.equals("=")){                    doOperation();                }            }        };        //键盘监听器:强制合法输入,从而匹配字符串。        KeyListener klInput = new KeyListener() {            String text = taMain.getText();            @Override            public void keyTyped(KeyEvent e) {}            @Override            public void keyReleased(KeyEvent e) {}            @Override            public void keyPressed(KeyEvent e) {                if(CleanWindow == true){                    taMain.setText("");                }                char keyChar = e.getKeyChar();                int keyCode = e.getKeyCode();                //输入性按键                for (int i = 0; i < 18; i++) {                    if(i==14){continue;}                    char[] temp = names[i].toCharArray();                    char theKey = temp[0];                    if(keyChar == theKey){                        taMain.append(names[i]);                    }                }                //功能性按键                if(keyCode==KeyEvent.VK_EQUALS || keyCode==KeyEvent.VK_ENTER){                    doOperation();                }                if(keyCode==KeyEvent.VK_BACK_SPACE){                    taMain.setText(text.substring(0,text.length()-1));                }            }        };        taMain.addKeyListener(klInput);        //批量设置按钮,定义按钮功能        for (int i = 0; i < names.length; i++) {            String name = names[i];            Button b = new Button(name);            if(i>=18 || i==14){                b.addActionListener(alFunc);            }else {                b.addActionListener(alInput);            }            p1.add(b);        }        //窗口关闭功能实现(使用匿名内部类适配器重写)        f.addWindowListener(new WindowAdapter(){            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });        dHistory.addWindowListener(new WindowAdapter(){            public void windowClosing(WindowEvent e) {                dHistory.setVisible(false);            }        });        //菜单按键监听器        ActionListener menuListener = new ActionListener() {            public void actionPerformed(ActionEvent e) {                //为模式对话框添加不可编辑文本框                dHistory.add(taHistory);                taHistory.setEditable(false);                taHistory.setText(strHistory);                dHistory.pack();                dHistory.setVisible(true);            }        };        //查看历史记录功能        MenuBar mb = new MenuBar();        Menu function = new Menu("特殊服务");        MenuItem his = new MenuItem("查看历史计算记录");        his.addActionListener(menuListener);        function.add(his);        mb.add(function);        //初始化界面        taMain.setEditable(false);        f.addKeyListener(klInput);        f.setResizable(false);        f.setMenuBar(mb);        f.add(p1);        f.pack();        f.setVisible(true);    }    public static void main(String[] args) {        new Calculator().init();    }}
0 0
原创粉丝点击