计算机器总结(添加事件是重点!,还有接口抽象类):
练习:实现计算器的+、-、*、/运算功能
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`,它们分别创建简单计算器和科学计算器的按钮...
例如,可以有一个`Operator`抽象类,它的子类如`Add`, `Subtract`, `Multiply`, `Divide`分别代表四种基本的算术运算;同时,还可以有一个`Expression`类来处理复杂的表达式,如括号内的运算。 对于括号的处理,这...
计算器是计算机科学中一个基本而重要的概念,它模拟人类计算过程,执行数学运算。在这个案例中,我们关注的是“抽象数据类型”(ADT)在计算器设计与实现中的应用。抽象数据类型是一种高级编程概念,它允许我们定义...
在本项目中,我们主要探讨的是如何使用Visual C++ 6.0(简称VC6.0)这个经典的集成开发环境来实现一个功能完善的计算器程序,它不仅能够处理基本的四则运算,还支持符号优先级以及括号运算,提供良好的用户界面交互...
JAVA:抽象类和接口 接口与抽象类 接口与抽象类
利用C#实现计算器,我们可以学习到面向对象编程的基本概念,如类、对象、属性、方法以及事件处理。 首先,我们需要定义一个Calculator类,这个类是计算器的核心,它将包含执行各种数学运算的方法。例如,我们可以...
在这个计算器项目中,抽象工厂定义了创建不同类型的运算符(加、减、乘、除)的接口,而具体工厂则实现了这些接口,提供具体的运算符实例。 1. 抽象工厂(CalculatorFactory):这个接口定义了创建计算器所需的所有...
Java是一种典型的面向对象语言,它的核心思想是将现实世界中的实体抽象为类,然后通过实例化这些类创建对象。在这个计算器项目中,我们可以定义多个类来代表不同的组件,如数字按钮、运算符按钮、显示窗口等。每个类...
在MFC中,四则混合运算计算器的实现涉及以下几个关键知识点: 1. **MFC架构**:MFC基于C++,它将Windows编程的许多底层细节进行了抽象,提供了如CWinApp、CWnd、CButton、CEdit等类,用于创建应用程序、窗口、按钮...
接着,我们为每一种四则运算创建一个实现类,比如`AddOperation`、`SubtractOperation`、`MultiplyOperation`和`DivideOperation`,每个类都实现`Operation`接口并覆盖`calculate()`方法。 ```java public class ...
我们将在.m和.h文件中编写代码,其中.h文件定义了类的接口,.m文件实现了类的方法。对于四则运算计算器,我们需要创建一个Calculator类,它将处理计算逻辑。 Cocoa框架是iOS开发的核心,提供了许多基础服务和抽象层...
在计算器的例子中,抽象工厂可能被用来创建不同类型的按钮(如加、减、乘、除等)或运算逻辑,这些在不同的平台上可能会有不同的实现。例如,一个简单的网页计算器可能只需要基本的HTML和JavaScript来实现,而更复杂...
- 具体运算类(如Addition、Subtraction、Multiplication、Division):实现了Operation接口或继承自抽象类,覆盖了各自的运算逻辑。 在实现过程中,开发者可能还考虑了错误处理,如除数为零的情况,以及输入验证,...
通过这个项目,初学者不仅可以学习到基本的Java语法和面向对象编程概念,还可以了解如何组织代码、设计类结构以及如何利用接口进行抽象。此外,实际编写和运行这样的程序有助于巩固理论知识,提高编程技能。因此,这...
- 利用继承和多态的概念,可以创建抽象类或接口来定义通用行为,然后由具体的类实现这些行为。 4. **代码重用**: - 为了保持代码的整洁和可维护性,应使用方法封装重复的代码片段,例如计算加法、减法等的函数。...
2. **具体运算类(Concrete Classes)**:如`AddOperation`, `SubtractOperation`, `MultiplyOperation`, `DivideOperation`等,它们实现了接口或继承自抽象类,并提供了具体的运算实现。 3. **工厂类(Factory ...
【基于Java的四则运算计算器设计与实现】的毕业设计是一项综合性的项目,旨在通过创建一个GUI界面的计算器,让学生深入理解和应用Java编程语言的面向对象特性。此设计任务不仅涵盖了基本的四则运算,还涉及到更复杂...
例如,`seqList`可能是一个顺序列表的实现,`AbstractList`可能是对Java内置`List`接口的一个抽象基类,而`myStack.java`则可能实现了自定义的栈数据结构,用于存储用户的运算历史,方便连续计算。 6. **多态与继承...
然后,我们可以创建不同的具体计算器类,如`SimpleCalculator`、`AdvancedCalculator`等,这些类实现`ICalculator`接口,提供实际的计算逻辑。 ```csharp public interface ICalculator { int Add(int num1, int ...
这样做可以确保所有继承自这个抽象类的计算器子类(如`AddCalculator`, `SubtractCalculator`, `MultiplyCalculator`, `DivideCalculator`)都拥有统一的计算接口,从而实现代码的规范和可扩展性。 多态性是面向...