计算机器总结(添加事件是重点!,还有接口抽象类):
练习:实现计算器的+、-、*、/运算功能
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);
}
}*/