计算器基本运算实现,(时间,接口,抽象类)

 

 

计算机器总结(添加事件是重点!,还有接口抽象类):

 

 

 

练习:实现计算器的+、-、*、/运算功能

1.首先把窗体做出来。
面板选用网格布局,其中放按钮的面板可以用GridLayout或者FlowLayout.
      1、我选的是GridLayout~ 所以做出来的效果不是太好,GridLayout不可以改变按钮的大小,不过

GridbagLayout可以,还有一点,用GridLayout,要new button,不然的话button上不能加事件。

譬如:

//new 一个button才能添加事件
Button btm1=new Button("MC");
 jpp2.add(btm1);
 
//GridLayout可以用这个方法添加一个按钮,不过这个Button只是个很丑的装饰,用不了的~
 jpp2.add(new Button("MR"));

     2、用FlowLayout,可以直接用JButton把button逐个加上去,,然后设置大小,就会对齐。这个效果看起

来好些。 可以直接在new的jbutton上添加事件


2.添加事件:


   事件机制:
          事件源:
              1.只有图形界面类的组件才可以成为事件源对象
              2.你的动作发生在哪一个组件上,那么该组件就是事件源对象

          事件监听器方法:
              给事件源添加一个事件监听器方法,让事件源捕获到相应的事件操作(动作)
              才能去调用事件处理类的对象。
              事件源.addActionListener(事件处理类对象);

          事件处理类
              最终的处理者。
              public class 类名 implements ActionListener{
                        //实现抽象方法
               }          

e.x :
       事件源: 譬如,JButton,JPanel组件等。先决定一种组件对象为事件源对象。
                      就算JButton里有不同功能也行,一般一种组件为一个事件源,
                      用判断语句就能使用你想JButton实现的功能。 
                      e.x:在计算器中,数字按钮跟运算符按钮(+,-,*,/,=)的
                           功能有点不一样,可是都能再同一个事件里共存,要是分
                           开的话,传参会让人很纠结!!  (到现在我还是不太懂传参~,还没入      

                    门的赶脚~)

       事件监听方法:
            要给你的监听器在入口主函数那里面新建一个监听器才能用。
            事件处理类名  事件处理类对象 = new 时间处理类名();
            然后 把事件监听器加到组件上:
                 事件源.addActionListener(事件处理对象);

            e.x:WorkListener wl = new WorkListener(jff,text);
                bt0.addActionListener(wl);

      事件处理类:

            实现监听器的方法:
            public class 类名 implements ActionListener{
                        //实现抽象方法
               }   

              p.s:  implements 是接口实例化对象的关键词


(补充:接口与抽象类):

1.接口
        定义
               定义接口的关键字是:interface
               public interface 接口 extends 接口名,...{
                      //常量
                        public static final 数据类型  常量名 = 值;//常量名的每一个字母都要大写 

                     //抽象方法
                        public 返回值数据类型 方法名(数据类型,参数名);

                   注意:
                          1.接口可以继承多个接口;
                          2.接口中只有一种访问修饰符public
                          3.接口中默认就是常量,所以public static final都可以不写
                          4.接口也是一种类
                          5.接口不可以实例化对象。

        实现
               实现接口的关键字:implements
               格式:
                public class 类名 (extends 类或者抽象类) implements 接口,...{
               }

                注意:
                    1.类实现接口的时候,必须要实现接口中所有的抽象方法。
                    2.类实现接口后,实际上两者就存在继承关系(继承的特性都保留下来了)。
                    3.类可以继承类,然后再去实现接口。
                类就拥有了多个父接口。


2.抽象类
          抽象类就是介于类和接口之间的一个特殊类。
          定义与继承
          public abstract class 抽象类名 extends 抽象类或者类 implements 接口,...{
              //定义类中所有的属性和方法(普通方法和构造方法)
              //定义接口中的常量和抽象方法
              //常量
              访问修饰符 static final 数据类型 常量名 = 值; //常量名的每一个字母都要大写
              //抽象方法
              访问修饰符 abstract 返回值数据类型 方法名(数据类型 参数名 ,...);
            }

 

/*********************练习**********************************/

遇到问题:(很多问题!)

 

1、传参问题(这个问题很严重! 一般在构造方法里面传,估计要多敲代码才能多掌握些)

 

2、输入字符串问题(记性不好啊  ~   学完String就把他扔了~ 字符串连接可以直接用“+”)【就是感觉现在自己很多东西都不会,所以要多写总结啊~ 不然学一课忘一课,现在自己解决问题的能力还是很弱~ 基本上有什么问题都要请大神帮忙,真心想能自己解决问题啊!多思考,多问,多看,多敲!】

3、事件问题。一开始还以为每个Button都要新建一个监听器,那是错的。一种组件一般只要1个监听器,也可以用多个,不过传参的时候会比较很麻烦。
计算器我做了两种,下面这个是只有1个监听器的;还有一个是有三个监听器的。当然下面这个代码量少,好一些吧。方法,思路都差不多。
事件监听器有 : ActionListener, MouseListener,.. (有很多,暂时学了这两个)
           

/**********************入口主函数代码************************************/
package Calculator_2;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
//import java.awt.Font;
//import java.awt.GridBagConstraints;
//import java.awt.GridBagLayout;

public class Calculatornd {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
                Calculatornd cal = new Calculatornd();
                cal.showFrame();          
 }
 
 //显示一个窗体的方法
 public void showFrame(){
  JFrame jff = new JFrame(); //实例化一个窗体
  jff.setTitle("Calculator");//设置窗体标题
  jff.setSize(240, 330);//设置窗体大小
  jff.setLocationRelativeTo(null); //设置开始在桌面中央
  jff.setDefaultCloseOperation(3);//设置关闭
  jff.setResizable(false);//设置窗体不能设置大小
  jff.setLayout(new BorderLayout()); //设置面板布局(默认布局,可不写);
  addBackgroundImage(jff);//设置背景
  
  /**设置窗体北边****/
  JPanel jpp1 =  NorthPanel();
  //把文本框加入窗体北边
  jff.add(jpp1,BorderLayout.NORTH);
  
  /**设置窗体西边***/
  JPanel jpp2 = WestPanel();
  //把文本框加入窗体西边
  jff.add(jpp2,BorderLayout.WEST);
  
  /***设置窗体中间***/
  JPanel jpp3 = CenterPanel();
  //把文本框加入窗体中间
  jff.add(jpp3,BorderLayout.CENTER);
   
  jpp1.setOpaque(false);
  jpp2.setOpaque(false);
  jpp3.setOpaque(false);
  //System.out.println("这是"+jb.getActionCommand());
  jff.setVisible(true); //设置窗体可见
 
 }
 
 private JTextField text;
 private JFrame jff;
 private ActionListener wl;
 

 public void addBackgroundImage(JFrame jf){
  // 实例化一个ImageIcon的图标对象
  ImageIcon image = new ImageIcon("images/11.jpg");
  // 实例化一个标签对象
  JLabel background = new JLabel(image);
  // 设置标签显示的位置和标签的大小
  background.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
  //将标签添加到窗体的第二层面板上
  jf.getLayeredPane().add(background,new Integer(Integer.MIN_VALUE));
  //获取窗体的第一层面板对象
  JPanel contentPanel = (JPanel)jf.getContentPane();
  //设置第一层面板为透明
  contentPanel.setOpaque(false);
 }
 
 /*******************设置窗体北边*************************/
 
 public JPanel NorthPanel(){
 //实例化一个面板
 JPanel jpp1 = new JPanel();
 jpp1.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
 //实例化一个菜单
 //JMenu
 //实例化一个文本输入框
 text = new JTextField();
 text.setEditable(false);
 //text.setBackground(WHITE);
 text.setPreferredSize(new Dimension(210,60));
 jpp1.add(text);
 return jpp1;
 
 }
 
 /*******************设置窗体西边*************************/
 public JPanel WestPanel(){
 
 JPanel jpp2 = new JPanel();
 jpp2.setLayout(new GridLayout(6,4));
 jpp2.setPreferredSize(new Dimension(170,123));
 WorkListener wl = new WorkListener(jff,text);
    //设置按钮
 Button btm1=new Button("MC");
 jpp2.add(btm1);
 
 jpp2.add(new Button("MR"));
 jpp2.add(new Button("MS"));
 jpp2.add(new Button("M+"));
 jpp2.add(new Button("  "));
 jpp2.add(new Button("CE"));
 jpp2.add(new Button("C"));
 jpp2.add(new Button("+-"));
 
 //添加按钮“7”,给按钮添加一个事件
 Button bt7 = new Button("7");
 jpp2.add(bt7);

 //添加按钮“8”,给按钮添加一个事件
 Button bt8 = new Button("8");
 jpp2.add(bt8); 

 //添加按钮“9”,给按钮添加一个事件
 Button bt9 = new Button("9");
 jpp2.add(bt9); 

 //添加按钮“/”
 Button jbdi =new Button("/");
 jpp2.add(jbdi);
 
 //添加按钮“4”,给按钮添加一个事件
 Button bt4 = new Button("4");
 jpp2.add(bt4);
 
 //添加按钮“5”,给按钮添加一个事件
 Button bt5 = new Button("5");
 jpp2.add(bt5);
 
 //添加按钮“6”,给按钮添加一个事件
 Button bt6 = new Button("6");
 jpp2.add(bt6);
 
 //添加按钮“*”
 Button jbmu = new Button("*");
 jpp2.add(jbmu);
 
 //添加按钮“1”,给按钮添加一个事件
 Button bt1 = new Button("1");
 jpp2.add(bt1);
  
 //添加按钮“2”,给按钮添加一个事件
 Button bt2 = new Button("2");
 jpp2.add(bt2);
 
 //添加按钮“3”,给按钮添加一个事件
 Button bt3 = new Button("3");
 jpp2.add(bt3);
 
 //添加按钮“-”
 Button jbmi =new  Button("-");
 jpp2.add(jbmi);
 
 //添加按钮“0”,给按钮添加一个事件
 Button bt0 = new Button("0");
 jpp2.add(bt0);

 jpp2.add(new Button("."));
 
 //添加按钮“=”,给按钮添加一个事件
 Button bt00 = new Button("=");
 jpp2.add(bt00);
 
 //添加按钮“+”,
 Button bta = new Button("+");
 jpp2.add(bta);

 //给按钮添加监听器
 bt0.addActionListener(wl);
 bt1.addActionListener(wl);
 bt2.addActionListener(wl);
 bt3.addActionListener(wl);
 bt4.addActionListener(wl);
 bt5.addActionListener(wl);
 bt6.addActionListener(wl);
 bt7.addActionListener(wl);
 bt8.addActionListener(wl);
 bt9.addActionListener(wl);
 bt00.addActionListener(wl);
 jbdi.addActionListener(wl);
 bta.addActionListener(wl);
 jbmi.addActionListener(wl);
 jbmu.addActionListener(wl);
 
 
 return jpp2;
}
 
 /*******************设置窗体中间******************/
 
 public JPanel CenterPanel(){
  
 JPanel jpp3 = new JPanel();
 jpp3.setLayout(new GridLayout(6,1));
 jpp3.setPreferredSize(new Dimension(45,21));
 
 jpp3.add(new Button("M-"));
 jpp3.add(new Button("V"));
 jpp3.add(new Button("%"));
 jpp3.add(new Button("1/x"));
 jpp3.add(new Button(" "));
 //添加按钮“=”,添加事件
 Button bte = new Button("00");
 jpp3.add(bte);
 bte.addActionListener(wl);
 
        return jpp3;
 
 }
 
}

/*********************监听器方法************************************/
package Calculator_2;

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

import javax.swing.JFrame;
import javax.swing.JTextField;

public class WorkListener implements ActionListener{

 private String str,stb;
 private String sta;
 private String a;
 private int b,c,d;

 private JTextField text;
 private JFrame jf;
 
 public WorkListener(JFrame jf,JTextField text){
  this.jf=jf;
  this.text=text;
 }
 @Override
 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  str = e.getActionCommand();

     if(str=="="){
   a = text.getText();
   if(a.contains("+")){
   b = Integer.parseInt(a.substring(0, a.indexOf('+')));
   c = Integer.parseInt(a.substring(a.indexOf('+')+1,a.length()));
   d=b+c;
   text.setText(""+d);
     } 
 else if(a.contains("-")&&a.indexOf('-')==0){
   b = Integer.parseInt(a.substring(1, a.lastIndexOf('-')));
   c = Integer.parseInt(a.substring(a.lastIndexOf('-')+1,a.length()));
   d=-b-c;
   text.setText(""+d);
    }
 else if(a.contains("-")&&a.indexOf('-')!=0){
   b = Integer.parseInt(a.substring(0, a.indexOf('-')));
   c = Integer.parseInt(a.substring(a.indexOf('-')+1,a.length()));
   d=b-c;
   text.setText(""+d);
     }
 else if(a.contains("*")){
   b = Integer.parseInt(a.substring(0, a.indexOf('*')));
   c = Integer.parseInt(a.substring(a.indexOf('*')+1,a.length()));
   d=b*c;
   text.setText(""+d);
     }
 else if(a.contains("/")){
          b = Integer.parseInt(a.substring(0, a.indexOf('/')));
   c = Integer.parseInt(a.substring(a.indexOf('/')+1,a.length()));
   d=b/c;
   text.setText(""+d);
        }


   sta = String.valueOf(d);
   stb=sta;
  }

 else if((str=="0")||(str=="1")||(str=="2")||(str=="3")||
  (str=="4")||(str=="5")||(str=="6")||(str=="7")||
  (str=="8")||(str=="9")||(str=="+")||(str=="-")||
  (str=="*")||(str=="/")){
   if(stb==null){
    stb=str;     
    }
   else{
    stb=stb+str;}
    text.setText(stb);
       }
   }
  }
 

//问题代码
if(str=="="){
   a = text.getText();
if(str!="-"){
b = Integer.parseInt(a.substring(0, a.indexOf(str)));  //这个不行????   因为str是“=”,不

是变量 
c = Integer.parseInt(a.substring(a.indexOf(str)+1,a.length()));
//System.out.println(a);
if(a.contains("+")){
d=b+c;
text.setText(""+d);
}    
else if(a.contains("*")){
d=b*c;
text.setText(""+d);
}
else if(a.contains("/")){
d=b/c;
text.setText(""+d);
}*/

/*else if(a.contains("-")&&a.indexOf('-')==0){
 b = Integer.parseInt(a.substring(1, a.indexOf('-')));
 c = Integer.parseInt(a.substring(a.indexOf('-')+1,a.length()));
 d=-b-c;
 text.setText(""+d);
}
}*/

 

你可能感兴趣的:(抽象类)