版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}