练手/计算器/GUI/AWT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XGL1569348/article/details/56070104

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

/**
 * 实现运算符字符串的计算类
 * @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();
    }
}

猜你喜欢

转载自blog.csdn.net/XGL1569348/article/details/56070104