`
rita_ka
  • 浏览: 11545 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
 
阅读更多

 

 

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

 

 

 

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

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);
}
}*/

 

分享到:
评论

相关推荐

    抽象工厂模式实现计算器

    2. **具体工厂类(Concrete Factories)**:实现了抽象工厂接口,负责创建具体的产品对象。例如,我们可以有`SimpleCalculatorFactory`和`ScientificCalculatorFactory`,它们分别创建简单计算器和科学计算器的按钮...

    java实现的XP系统下自带的计算器,包括括号的实现,逻辑运算的实现、所有算数运算的实现等。科学性和标准型计算器都实现了。等

    例如,可以有一个`Operator`抽象类,它的子类如`Add`, `Subtract`, `Multiply`, `Divide`分别代表四种基本的算术运算;同时,还可以有一个`Expression`类来处理复杂的表达式,如括号内的运算。 对于括号的处理,这...

    计算器(抽象数据类型设计与实现)

    计算器是计算机科学中一个基本而重要的概念,它模拟人类计算过程,执行数学运算。在这个案例中,我们关注的是“抽象数据类型”(ADT)在计算器设计与实现中的应用。抽象数据类型是一种高级编程概念,它允许我们定义...

    VC++实现计算器 ,可实现符号优先级及括号运算

    在本项目中,我们主要探讨的是如何使用Visual C++ 6.0(简称VC6.0)这个经典的集成开发环境来实现一个功能完善的计算器程序,它不仅能够处理基本的四则运算,还支持符号优先级以及括号运算,提供良好的用户界面交互...

    JAVA:接口与抽象类

    JAVA:抽象类和接口 接口与抽象类 接口与抽象类

    利用C#实现的计算器的实现

    利用C#实现计算器,我们可以学习到面向对象编程的基本概念,如类、对象、属性、方法以及事件处理。 首先,我们需要定义一个Calculator类,这个类是计算器的核心,它将包含执行各种数学运算的方法。例如,我们可以...

    用VS2005实现一个计算器功能(利用抽象工厂模式编写)

    在这个计算器项目中,抽象工厂定义了创建不同类型的运算符(加、减、乘、除)的接口,而具体工厂则实现了这些接口,提供具体的运算符实例。 1. 抽象工厂(CalculatorFactory):这个接口定义了创建计算器所需的所有...

    加减乘除四则混合运算计算器-java

    Java是一种典型的面向对象语言,它的核心思想是将现实世界中的实体抽象为类,然后通过实例化这些类创建对象。在这个计算器项目中,我们可以定义多个类来代表不同的组件,如数字按钮、运算符按钮、显示窗口等。每个类...

    vc60MFC写的四则混合运算计算器

    在MFC中,四则混合运算计算器的实现涉及以下几个关键知识点: 1. **MFC架构**:MFC基于C++,它将Windows编程的许多底层细节进行了抽象,提供了如CWinApp、CWnd、CButton、CEdit等类,用于创建应用程序、窗口、按钮...

    简单工厂模式(四则运算)

    接着,我们为每一种四则运算创建一个实现类,比如`AddOperation`、`SubtractOperation`、`MultiplyOperation`和`DivideOperation`,每个类都实现`Operation`接口并覆盖`calculate()`方法。 ```java public class ...

    iOS实现四则运算计算器的开发

    我们将在.m和.h文件中编写代码,其中.h文件定义了类的接口,.m文件实现了类的方法。对于四则运算计算器,我们需要创建一个Calculator类,它将处理计算逻辑。 Cocoa框架是iOS开发的核心,提供了许多基础服务和抽象层...

    用抽象工厂做的一个计算器

    在计算器的例子中,抽象工厂可能被用来创建不同类型的按钮(如加、减、乘、除等)或运算逻辑,这些在不同的平台上可能会有不同的实现。例如,一个简单的网页计算器可能只需要基本的HTML和JavaScript来实现,而更复杂...

    面向对象思想做的简单计算器

    - 具体运算类(如Addition、Subtraction、Multiplication、Division):实现了Operation接口或继承自抽象类,覆盖了各自的运算逻辑。 在实现过程中,开发者可能还考虑了错误处理,如除数为零的情况,以及输入验证,...

    JAVA实现的计算器

    通过这个项目,初学者不仅可以学习到基本的Java语法和面向对象编程概念,还可以了解如何组织代码、设计类结构以及如何利用接口进行抽象。此外,实际编写和运行这样的程序有助于巩固理论知识,提高编程技能。因此,这...

    java完成的计算器课程设计

    - 利用继承和多态的概念,可以创建抽象类或接口来定义通用行为,然后由具体的类实现这些行为。 4. **代码重用**: - 为了保持代码的整洁和可维护性,应使用方法封装重复的代码片段,例如计算加法、减法等的函数。...

    工厂模式实现的简单计算器

    2. **具体运算类(Concrete Classes)**:如`AddOperation`, `SubtractOperation`, `MultiplyOperation`, `DivideOperation`等,它们实现了接口或继承自抽象类,并提供了具体的运算实现。 3. **工厂类(Factory ...

    基于java的四则运算计算器设计与实现毕业设计任务书.pdf

    【基于Java的四则运算计算器设计与实现】的毕业设计是一项综合性的项目,旨在通过创建一个GUI界面的计算器,让学生深入理解和应用Java编程语言的面向对象特性。此设计任务不仅涵盖了基本的四则运算,还涉及到更复杂...

    基于java实现的GUI图形化界面的简单计算器,实现加减乘除、乘方,可以连续运算,带一定纠错功能

    例如,`seqList`可能是一个顺序列表的实现,`AbstractList`可能是对Java内置`List`接口的一个抽象基类,而`myStack.java`则可能实现了自定义的栈数据结构,用于存储用户的运算历史,方便连续计算。 6. **多态与继承...

    计算器C#工厂模式实现代码

    然后,我们可以创建不同的具体计算器类,如`SimpleCalculator`、`AdvancedCalculator`等,这些类实现`ICalculator`接口,提供实际的计算逻辑。 ```csharp public interface ICalculator { int Add(int num1, int ...

    仿Windows计算器源码

    这样做可以确保所有继承自这个抽象类的计算器子类(如`AddCalculator`, `SubtractCalculator`, `MultiplyCalculator`, `DivideCalculator`)都拥有统一的计算接口,从而实现代码的规范和可扩展性。 多态性是面向...

Global site tag (gtag.js) - Google Analytics