GUI的事件处理接口回调

事件处理

事件处理:
事件(Event): 用户对组件的一个操作,称之为一个事件
事件源(Event source): 产生事件的对象
事件处理方法(Event handler): 能够接收、解析和处理事件类对象、实现和用户交互的方法,事件监听器

为了简化编程,针对大多数事件监听器接口定义了相应的实现类————事件适配器类,在适配器类中,实现了相应监听器接口
中所有的方法,但不做任何事情

接口回调:
当一个对象需要给外部对象提供数据时,我们可以定义一个内部接口把数据通过接口传递过去。所有外部对象需要这个数据时,
就实现这个接口,这样的好处是传递数据的对象不直接依赖接收数据的对象(降低耦合度)


举例需求:
Frame1里有:金额标签; 购买按钮,点击购买按钮后弹出Frame2
Frame2里有:设置金额输入框;付款按钮,点击付款按钮后金额数就自动传递给Frame1
1、笨方法实现:在Frame2里创建Frame1的对象,然后传值给Frame1的对象;{这样耦合度太强不利于维护}
2、接口回调:在Frame2里创建一个接口供Frame1实现调用



Fram1.java

package com.vince.GuiDemo;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Fram1 extends Frame implements Fram2.MoneyListener {

    private Label label = new Label("jinge");   //定义标签,并设置标签的名称
    private Button btn = new Button("goumai");  //定义按钮,并设置按钮的名称
    public Fram1(){
        this.setSize(400, 200); //设置页面宽度和高度
        this.setLayout(new FlowLayout());     //设置页面线性布局
        this.add(btn);                        //给窗体添加按钮
        this.add(label);                      //给窗体添加标签
        //给按钮添加单击事件监听器 {以匿名内部类的方式添加}
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //创建Fram2的一个对象,就打开了Fram2的窗口,然后调用Fram2里的方法:setMoneyListener,把Fram1当前对象传过去
                //这里Fram1.this 不能写成this,写成this就是ActionListener对象了,因为是在匿名内部类里面的
                new Fram2().setMoneyListener(Fram1.this);
            }
        });

        //给窗体添加关闭事件
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
            }
        });

        this.setVisible(true);
    }

    //继承了Fram2里的MoneyListener接口,就要实现其接口的方法,继承接口的同时其接口里的方法里的属性值也自动的获取到了
    //这个方法不是Fram1自己调用的,是Fram1继承了谁的接口谁就回调这个方法
    @Override
    public void setMoney(String money) {
        label.setText(money); //既然自动获取到了接口方法里的属性值:money,就可以使用此值了,为标签设置这个money值
    }

    public static void main(String[] args) {
        new Fram1();
    }
}

Fram2.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Fram2 extends Frame {

    private TextField textField = new TextField(20); //定义输入框,并设置输入框的长度20
    private Button btn = new Button("fukaun");            //定义按钮,并设置按钮的名称
    public Fram2(){
        this.setSize(400, 200); //设置页面宽度和高度
        this.setLayout(new FlowLayout());     //设置页面线性布局
        this.add(textField);                  //给窗体添加输入框,谁代码在谁在窗体里面就靠前
        this.add(btn);                        //给窗体添加按钮
        //给按钮添加单击事件监听器 {以匿名内部类的方式添加}
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String money = textField.getText(); //获取输入框里的文本值
                moneyListener.setMoney(money);      //把(从获取输入框里的文本值)设置到MoneyListener接口里面去
                                                    //如果谁继承了这个(MoneyListener)接口,谁就会自动得到这个money值
                                                    //又因为此时的moneyListener其实就是Fram1的当前对象,所以这里的setMoney方法就是Fram1里的方法,而这个money参数是Fram2这边的参数值
            }
        });

        //给窗体添加关闭事件
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
            }
        });

        this.setVisible(true);
    }

    //定义一个接口:供其它Fram调用这个接口,从而获取在此Fram2上的设置的金额数
    public static interface MoneyListener{
        public void setMoney(String money);
    }

    //定义这个接口的属性{这里就相当于一种数据类型比如:private String name}
    private MoneyListener moneyListener;

    //为接口这个属性设置set方法,供其它Fram调用 {注意这里调用此方法后,得到的是MoneyListener这个属性{类似String、int等}}
    //Fram1里面调用了这个方法,并把Fram1的当前对象传递了过来,所以此时moneyListener其实就是Fram1的当前对象
    //为什么这里的moneyListener可以代表Fram1的当前对象?因为Fram1继承了此接口,所以Fram1的当前对象就拥有了这个MoneyListener这个属性
    public void setMoneyListener(MoneyListener moneyListener){
        this.moneyListener = moneyListener;
    }


}

你可能感兴趣的:(GUI的事件处理接口回调)