回调过程
简单理解就是,A调用B,然后B在调用A
对应模型
对应代码
回调接口
package callback;
public interface CallBack {
void backMethod();
}
调用者
package callback.other;
import callback.CallBack;
public class Caller implements CallBack{
private Called called;
public Caller(Called called) {
this.called = called;
//注册回调,让被调用者能够调用调用者的方法
this.called.addRegister(this);
}
public void request() {
System.out.println("这是调用者Caller,开始调用request方法");
called.specRequest();
}
@Override
public void backMethod() {
System.out.println("回调方法backMethod,用于调Caller的方法");
requestSelf();
}
//可以使用调用者的变量,方法等
public void requestSelf() {
System.out.println("调用者Caller自身方法requestSelf");
}
}
被调用者
package callback.other;
import callback.CallBack;
public class Called {
CallBack CallBack;
public void addRegister(CallBack CallBack) {
this.CallBack = CallBack;
}
public void specRequest() {
System.out.println("这是被调用者Called具体的方法specRequest");
//开始回调
CallBack.backMethod();
}
}
测试类
package callback.other;
public class Test {
public static void main(String[] args) {
//被调用者
Called called = new Called();
//调用者
Caller caller = new Caller(called);
//调用者发起请求
caller.request();
}
}
测试结果
这是调用者Caller,开始调用request方法
这是被调用者Called具体的方法specRequest
回调方法backMethod,用于调Caller的方法
调用者Caller自身方法requestSelf
达到预期回调效果
回调函数应用JFrame点击事件
内部类方式
对应代码
package callback.other;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyJFrame extends JFrame {
private static final long serialVersionUID = 1L;
//初始化一个jlable,通过点击事件改变标签显示
JLabel emptyLable = new JLabel("开始文字");
public MyJFrame() {
}
public void start() {
//初始化一个jframe
JFrame frame = new JFrame("测试窗口");
//初始化一个panel
JPanel panel = new JPanel();
//初始化一个容器
Container container = frame.getContentPane();
//初始化一个按钮
JButton button = new JButton("变变");
button.addActionListener(new ConcreteActionListener());
//设置布局
container.setLayout(new FlowLayout());
//把按钮添加到pannel
panel.add(emptyLable);
panel.add(button);
//设置关闭方式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把panel添加到容器
container.add(panel);
//设置大小
frame.setSize(600,500);
//设置位置
frame.setLocation(100, 100);
//设置可见性
frame.setVisible(true);
}
//需要回调方法,重新显示内容
private void display() {
emptyLable.setText(System.currentTimeMillis()+"");
}
public class ConcreteActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//回调
display();
}
}
}
测试代码
package callback.other;
public class MyFrame {
public static void main(String[] args) {
MyJFrame jFrame = new MyJFrame();
jFrame.start();
}
}
测试结果
- 第一次结果
- 点击结果
调用者自身实现回调接口方式
目的是为了简化实例化对象,减少对象数据,即省略以下代码
对应代码
package callback.other;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyJFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
//初始化一个jlable,通过点击事件改变标签显示
JLabel emptyLable = new JLabel("开始文字");
public MyJFrame() {
}
public void start() {
//初始化一个jframe
JFrame frame = new JFrame("测试窗口");
//初始化一个panel
JPanel panel = new JPanel();
//初始化一个容器
Container container = frame.getContentPane();
//初始化一个按钮
JButton button = new JButton("变变");
button.addActionListener(this);
//设置布局
container.setLayout(new FlowLayout());
//把按钮添加到pannel
panel.add(emptyLable);
panel.add(button);
//设置关闭方式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把panel添加到容器
container.add(panel);
//设置大小
frame.setSize(600,500);
//设置位置
frame.setLocation(100, 100);
//设置可见性
frame.setVisible(true);
}
//需要回调方法,重新显示内容
private void display() {
emptyLable.setText(System.currentTimeMillis()+"");
}
@Override
public void actionPerformed(ActionEvent e) {
//回调
display();
}
}
测试类
package callback.other;
public class MyFrame {
public static void main(String[] args) {
MyJFrame jFrame = new MyJFrame();
jFrame.start();
}
}
测试结果
- 第一次结果
- 点击结果