Swing事件处理模型和事件监听器

一个完整的Swing程序除了有窗口有组件之外,还要让这些按钮之类的组件可以点击,并且点击之后会执行一些操作。这个在Java中叫作事件。点击操作叫作事件,点击之后执行的内容则在事件处理中完成。具体怎么实现呢?接下来我们来看看具体的步骤

一、事件处理模型

当我们在窗体中放置了各种组件之后图形界面已经很丰富了,但是还不能响应用户的任何操作。若使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。

在事件处理的过程中,主要涉及三类对象。

  • Event(事件):用户对组件的一次操作称为一个事件,以类的形式出现。例如,键盘操作对应的事件类是 KeyEvent。
  • Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮 Button。
  • Event Handler(事件处理者):接收事件对象并对其进行处理的对象事件处理器,通常就是某个 Java 类中负责处理事件的成员方法。

在这里插入图片描述

二、动作事件监听器

动作事件监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它监听,像按钮被里击、列表框中选择一项等。

事件名称:ActionEvent。
事件监听接口: ActionListener。
事件相关方法:

    addActionListener() 添加监听,
    removeActionListener() 删除监听。

涉及事件源:JButton、JList、JTextField 等。

以下是一个例子,点击按钮之后统计点击的次数:

package swing;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Toolkit;
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.JList;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
/**
 * 点击按钮统计点击次数
 */
public class Demo18_ActionListener extends JFrame{
	JLabel label;
	JButton button1;
	int clicks=0;
	public static void main(String[] args){
		Demo18_ActionListener frame=new Demo18_ActionListener();
        frame.setVisible(true);
    }
	public Demo18_ActionListener() {
		setTitle("动作事件监听器示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SwingUtils.setCenter(this);//设置窗体大小600*800并居中
        JPanel contentPane=new JPanel();
        contentPane.setBorder(new EmptyBorder(50,50,50,50));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);
        label=new JLabel(" ");
        label.setFont(new Font("楷体",Font.BOLD,35));    //修改字体样式
        contentPane.add(label, BorderLayout.SOUTH);
        button1=new JButton("我是普通按钮");    //创建JButton对象
        button1.setFont(new Font("黑体",Font.BOLD,35));    //修改字体样式
        button1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                label.setText("按钮被单击了 "+(clicks++)+" 次");
            }
        });
        contentPane.add(button1);
	}
}

在这里插入图片描述

三、焦点监听器

除了单击事件外,焦点事件监听器在实际项目中应用也比较广泛,例如将光标离开文本框时弹出对话框,或者将焦点返回给文本框等。

事件名称:FocusEvent。

事件监听接口: FocusListener。

事件相关方法:addFocusListener() 添加监听,removeFocusListener() 删除监听。

涉及事件源:Component 以及派生类。

FocusEvent 接口定义了两个方法,分别为 focusGained() 方法和 focusLost() 方法,其中 focusGained() 方法是在组件获得焦点时执行,focusLost() 方法是在组件失去焦点时执行。

以下是一个例子,在失去焦点和获得焦点的时候分别进行提示;

package swing;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
 * FocusEvent 接口定义了两个方法,
 * 分别为 focusGained() 方法和 focusLost() 方法,
 * 其中 focusGained() 方法是在组件获得焦点时执行,
 * focusLost() 方法是在组件失去焦点时执行。
 */
public class Demo19_FocusListener extends JFrame{
    JLabel label;
    JButton button1;
    JTextField txtfield1;
    public static void main(String[] args){
    	Demo19_FocusListener frame=new Demo19_FocusListener();
        frame.setVisible(true);
    }
    public Demo19_FocusListener() {
    	setTitle("焦点事件监听器示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SwingUtils.setCenter(this);//设置窗体大小600*800并居中
        JPanel contentPane=new JPanel();
        contentPane.setBorder(new EmptyBorder(200,50,200,50));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);       
        label=new JLabel(" ");
        label.setFont(new Font("楷体",Font.BOLD,30));    //修改字体样式
        contentPane.add(label, BorderLayout.SOUTH);
        contentPane.add(new JButton("按钮"), BorderLayout.EAST);
        txtfield1=new JTextField();    //创建文本框
        txtfield1.setFont(new Font("黑体", Font.BOLD, 30));    //修改字体样式
        txtfield1.addFocusListener(new FocusListener()
        {
            @Override
            public void focusGained(FocusEvent arg0)
            {
                // 获取焦点时执行此方法
                label.setText("文本框获得焦点,正在输入内容");
            }
            @Override
            public void focusLost(FocusEvent arg0)
            {
                // 失去焦点时执行此方法
                label.setText("文本框失去焦点,内容输入完成");
            }
        });
        contentPane.add(txtfield1);
    }
}

在这里插入图片描述

四、监听列表项选择事件

列表框控件 JList 会显示很多项供用户选择,通常在使用时会根据用户选择的列表项完成不同的操作。

以下是一个例子:
点击列表中的不同选项,显示不同的信息。

package swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
 * 监听列表的选择事件
 */
public class Demo20_ListSelectionListener extends JFrame{
	private JList list;
    private JLabel label;
    public Demo20_ListSelectionListener() {
    	setTitle("监听列表项选择事件");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SwingUtils.setCenter(this);//设置窗体大小600*800并居中
        JPanel contentPane=new JPanel();
        contentPane.setBorder(new EmptyBorder(15,15,80,15));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);
        label=new JLabel(" ");
        label.setFont(new Font("宋體", 1, 25));
        label.setOpaque(true);
        label.setBackground(Color.yellow);
        contentPane.add(label,BorderLayout.SOUTH);
        JScrollPane scrollPane=new JScrollPane();
        contentPane.add(scrollPane,BorderLayout.CENTER);
        list=new JList();
        list.setVisibleRowCount(50);
        list.setFont(new Font("宋體", 1, 20));
        scrollPane.setViewportView(list);
        String[] listData=new String[17];
        listData[0]="《一点就通学Java》";
        listData[1]="《一点就通学PHP》";
        listData[2]="《一点就通学Visual Basic)》";
        listData[3]="《一点就通学Visual C++)》";
        listData[4]="《Java编程词典》";
        listData[5]="《PHP编程词典》";
        listData[6]="《C++编程词典》";
        listData[7]="《一点就通学Java》";
        listData[8]="《一点就通学PHP》";
        listData[9]="《一点就通学Visual Basic)》";
        listData[10]="《一点就通学Visual C++)》";
        listData[11]="《Java编程词典》";
        listData[12]="《PHP编程词典》";
        listData[13]="《C++编程词典》";
        listData[14]="《Java编程词典》";
        listData[15]="《PHP编程词典》";
        listData[16]="《C++编程词典》";
        list.setListData(listData);
        list.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e){
            	label.setText("感谢您购买:"+list.getSelectedValue());
            }
        });
        setVisible(true);
    }
	public static void main(String[] args) {
		Demo20_ListSelectionListener frame = new Demo20_ListSelectionListener();
	}
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值