首页 > 学院 > 开发设计 > 正文

GUI练手项目之AWT计算器

2019-11-08 01:32:43
字体:
来源:转载
供稿:网友
import java.awt.BorderLayout;import java.awt.Button;import java.awt.Dialog;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.Panel;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;/** * 实现运算符字符串的计算类 * @author Dell */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 "输入不合法,请检查后再输入!!计算器都不会用,是不是傻。"; } } public static void main(String[] args) { System.out.println(new Operator("1+1").Operation()); }}/** * 计算器窗口 * @author Dell * */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 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(); String text = taMain.getText(); if(button.equals("Del")){ taMain.setText(text.substring(0,text.length()-1)); } if(button.equals("Clean")){ taMain.setText(""); } if(button.equals("=")){ String temp = taMain.getText(); String result = String.valueOf(new Operator(temp).Operation()); taMain.setText(result); if(result.equals("输入不合法,请检查后再输入!!计算器都不会用,是不是傻。")){ CleanWindow = true; } strHistory = strHistory + temp + "=" + result + "/n"; } } }; //创造文本框的键盘监听器 KeyListener kl = new KeyListener() { @Override public void keyPressed(KeyEvent e) { int vk = e.getKeyCode(); if(vk == KeyEvent.VK_ENTER || vk == KeyEvent.VK_EQUALS){ String temp = taMain.getText(); String result = String.valueOf(new Operator(temp).Operation()); taMain.setText(result); if(result.equals("输入不合法,请检查后再输入!!计算器都不会用,是不是傻。")){ CleanWindow = true; } strHistory = strHistory + temp + "=" + result + "/n"; }else{ if(CleanWindow == true){ taMain.setText(""); CleanWindow = false; } } } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }; taMain.addKeyListener(kl); //批量设置按钮,定义按钮功能 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); //初始化界面 f.setResizable(false); f.setMenuBar(mb); f.add(p1); f.pack(); f.setVisible(true); } public static void main(String[] args) { new Calculator().init(); }}

两百行内(包括增加可读性的空行),实现一个可以按钮控制,键盘控制,可查看历史记录的四则运算计算器。

待解决BUG:输入null的问题。 待更新……


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表