事件驱动的模型
应用程序接受你的操作进行处理
所有和事件相关的操作都放是放在事件调度线程 (Event Dispatch)中进行的。比如点击一个按钮,对应的ActionListener.actionPerformed 方法中的代码,就是在事件调度线程 Event Dispatch Thread中执行的。
在开始讲解这3种线程之前, 要建立一个概念: 事件调度线程是单线程的。
为什么呢?
这是因为 Swing里面的各种组件类,比如JTextField,JButton 都不是线程安全的,这就意味着,如果有多个线程,那么同一个JTextField的setText方法,可能会被多个线程同时调用,这会导致同步问题以及错误数据的发生。
如果把组件类设计成为线程安全的,由于Swing事件调度的复杂性,就很有可能导致死锁的发生。
为了规避同步问题,以及降低整个Swing设计的复杂度,提高Swing的相应速度,Swing中的 事件调度线程被设计成为了单线程模式,即只有一个线程在负责事件的响应工作。
事件的基本处理过程
- 定义实现事件监听接口类
- 创建事件监听器
- 向事件源注册监听器对象
例子:
//定义实现事件监听接口类
class ActionHandler implements ActionListener{
//要把接口中的方法都实现
public void actionPerformed(){
//这个里面进行操作,就是要执行响应的内容
new test().l.setText("");//l是文本框,调用test中的文本框对象,将其内容设置为空
}
}
//创建事件监听器
ActionListener ac = new ActionHandler();
JButton b = new JButton();
//向事件源注册监听器对象
b.addActionListener(ac);
还可以
采用匿名内部类的方式进行处理
当事件源和事件很多的时候,如果按照上面的方法,就要创建很多事件监听器和事件监听器接口类,会让程序显的很臃肿,可读性较差,故推荐匿名内部类的方式
- 将注册、创建监听器、创建监听器接口类、三步骤融合到一起
JButton b = new JButton();
b.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent Event){
l.setText(""); //因为在类内部,所以就不用调用test();这个类了
}
}
)
动作事件的处理
动作事件类主要针对组件,
动作事件:例如单击按钮,选择菜单,在文本框中输入字符串并按Enter键, 这些都属于动作事件,动作事件监听接口是ActionListener接口,在这个接口中的抽象方法如下:
public void actionPerformed(ActionEvent e)
只要是实现了这个方法,也就是处理了动作事件
下面的实例主要是 通过单击按钮组件,引起按钮的文本发生变化
在这里插入代码片
事件处理demo
package com.one.container;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test {
JFrame myframe = new JFrame();
JLabel label1 = new JLabel("label1");
JLabel label2 = new JLabel("label2");
JButton button1 = new JButton("确定");
JButton button2 = new JButton("取消");
public void init() {
myframe.setSize(300, 200);
myframe.getContentPane().setLayout(null);
myframe.setTitle("java 小程序");
label1.setBounds(20, 20, 120, 27);
label2.setBounds(20, 40, 120, 27);
button1.setBounds(20, 60, 60, 27);
button2.setBounds(100, 60, 60, 27);
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label1.setText("你点了确定");
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label2.setText("你点了取消");
}
});
myframe.add(label1);
myframe.add(label2);
myframe.add(button1);
myframe.add(button2);
myframe.show();
}
public static void main(String[] args) {
new Test().init();
}
}
https://zhidao.baidu.com/question/562678873.html
2,
package com.one.container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JButtonEvent1 extends JFrame {
public JButtonEvent1(){
JButton button=new JButton("测试按钮");
button.setBounds(30, 60, 30, 30);
button.addActionListener(new ActionListener() {//匿名内部类
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource()).getText());
}
});
add(button);
}
public static void main(String[] args) {
JButtonEvent1 frame=new JButtonEvent1();
frame.setTitle("演示动作事件处理");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,300);
frame.setVisible(true);
}
}
参考阅读:线程安全的概念