JavaSwing 事件处理

事件驱动的模型

在这里插入图片描述

应用程序接受你的操作进行处理

所有和事件相关的操作都放是放在事件调度线程 (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);
    }
}

在这里插入图片描述

在这里插入图片描述

参考阅读:线程安全的概念

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值