Swing 计算器

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

/**
 * @author shy2850
 */
public class Calculator extends JApplet{
 private static final long serialVersionUID = 6011877688810114645L;
 static final char[] OPTS = {'+','-','*','/','%','p'};
 
 private JPanel mainPanel = new JPanel();
 private JPanel buttonPanel = new JPanel();
 private JTextField mainScreen = new JTextField("0");
 
 private Double num1;
 private Double num2;
 private Character opt;
 
 public void init(){
  setLayout(new BorderLayout());//简单布局
  add(mainScreen,BorderLayout.NORTH);
  add(buttonPanel,BorderLayout.CENTER);
  
  mainScreen.setFocusable(false);//不让键盘输入数据
  buttonPanel.setLayout(new GridLayout(4, 5, 8, 8));
  for (int i = 0; i < 10; i++) {
   buttonPanel.add(new NumberButton(new Integer(i)));
  }
  for (int i = 0; i < OPTS.length; i++) {
   buttonPanel.add(new DoubleOptButton(OPTS[i]));
  }
  buttonPanel.add(new BackspaceButton());
  buttonPanel.add(new DoteButton());
  buttonPanel.add(new ClearButton());
  buttonPanel.add(new AnswerButton());
 }
 
 public static void main(String[] args) {
      JFrame frame = new JFrame("我的计算器");
   Calculator c = new Calculator();
   c.init(); 
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setResizable(false);
   frame.setContentPane(c);
   frame.setBounds(400, 300, 400, 240);
   frame.setVisible(true);
 
 }
 
 /**
  * 按键类:作用是在mainScreen上面写字符
  * @author shy2850
  *
  */
 private class NumberButton extends JButton implements ActionListener{
  private static final long serialVersionUID = 2275846997927158356L;
  
  private String value;
  
  public NumberButton(int value) {
   super(value+"");
   this.value = value+"";
   addActionListener(this);
  }
  
  public void actionPerformed(ActionEvent e) {
   if("0".equals(mainScreen.getText())){
    mainScreen.setText(value);
   }else{
    mainScreen.setText(mainScreen.getText()+value);
   }
  }
 }
 
 private class DoteButton extends JButton implements ActionListener{
  private static final long serialVersionUID = -258745651987084843L;

  public DoteButton() {
   super(".");
   addActionListener(this);
  }
  
  public void actionPerformed(ActionEvent e) {
   String str = mainScreen.getText();
   if(!str.contains(".")){
    mainScreen.setText(str+".");
   }
  }
 }
 
 /**
  * 退格键 
  */
 private class BackspaceButton extends JButton implements ActionListener{

  private static final long serialVersionUID = 1405042174911616475L;
  
  public BackspaceButton() {
   super("back");
   addActionListener(this);
  }

  public void actionPerformed(ActionEvent e) {
   String str = mainScreen.getText();
   if(str.length() > 1){
    mainScreen.setText(str.substring(0,str.length()-1));
   }else if(str.length() == 1){
    mainScreen.setText("0");
   }
  }
  
 }
 
 /**
  * 运算符
  */
 private class DoubleOptButton extends JButton implements ActionListener{
  private static final long serialVersionUID = -7364459365692040675L;
  
  private char thisOpt;
  
  public DoubleOptButton(char opt) {
   super(""+(opt=='p'?"pow":opt));
   thisOpt = opt;
   addActionListener(this);
  }

  public void actionPerformed(ActionEvent arg0) {
   num1 = parseDouble();
   opt = thisOpt;
   mainScreen.setText("0");
  }
 }
 
 //清除按钮
 private class ClearButton extends JButton implements ActionListener{
  private static final long serialVersionUID = -5313525990144589143L;
  public ClearButton() {
   super("CE");
   addActionListener(this);
  }
  public void actionPerformed(ActionEvent e) {
   mainScreen.setText("0");
   clean();
  }
 }
 
 // 包装数值型转换工具
 private double parseDouble(){
  try {
   return Double.parseDouble(mainScreen.getText());
  } catch (NumberFormatException e) {
   JOptionPane.showMessageDialog(null, "数据异常!");
   mainScreen.setText("0");
   return 0.0;
  }
 }
 
 //清除内存数据
 private void clean(){
  num1 = null;
  num2 = null;
  opt = null;
 }
 
 // 等于号
 private class AnswerButton extends JButton implements ActionListener{

  private static final long serialVersionUID = -4642598104367432428L;
  public AnswerButton() {
   super("=");
   addActionListener(this);
  }

  public void actionPerformed(ActionEvent e) {
   num2 = parseDouble();
   if(null != opt){
    double answer = 0;
    switch(opt){
     case '+': 
      answer = num1+num2;
      break;
     case '-': 
      answer = num1-num2;
      break;
     case '*': 
      answer = num1*num2;
      break;
     case '/': 
      answer = num1/num2;
      break;
     case '%': 
      answer = num1%num2;
      break;
     case 'p': 
      answer = Math.pow(num1, num2);
      break;
     default: JOptionPane.showMessageDialog(null, "错误操作符!");
    }
    String result = answer+"";
    if(result.endsWith(".0")){
     result = result.replace(".0", "");
    }
    mainScreen.setText(result);
    clean();
   }
   
  }
  
 }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容