Java AWT 常用事件

    2025-09-30 02:18:40

    目录

    常用事件1. 窗体事件2. 鼠标事件3. 键盘事件4. 动作事件5. 选项事件6. 焦点事件7. 文档事件

    常用事件

    1. 窗体事件

    大部分 GUI 应用程序都需要使用 Window( 窗体)对象作为最外层的容器,可以说窗体对象是所有 GUI 应用程序的基础,在应用程序中通常都是将其他组件直接或者间接地置于窗体中;对窗体进行的操作,如窗体的打开、关闭、激活、停用等,都属于窗体事件(WindowEvent),JDK 中提供了一个类 WindowEvent 用于表示这些窗体事件。在应用程序中,当对窗体事件进行处理时,首先需要定义一个实现了 WindowListener 接口的类作为窗体监听器,然后通过 addWindowListener() 方法将窗体对象与窗体监听器绑定;java.awt.event.WindowEvent,详见:Class WindowEvent;程序运行后,监听器能捕捉这些事件,并通过相应方法输出不同的提示语:

    import java.awt.*;

    import java.awt.event.WindowEvent;

    import java.awt.event.WindowListener;

    public class Test {

    public static void main(String[] args) {

    final Frame f = new Frame("Regino");

    f.setSize(400, 300);

    f.setLocation(300, 200);

    f.setVisible(true);

    // 使用内部类创建WindowListener实例对象,监听窗体事件

    f.addWindowListener(new WindowListener() {

    public void windowOpened(WindowEvent e) {

    System.out.println("windowOpened---窗体打开事件");

    }

    public void windowIconified(WindowEvent e) {

    System.out.println("windowIconified---窗体图标化事件");

    }

    public void windowDeiconified(WindowEvent e) {

    System.out.println("windowDeiconified---窗体取消图标化事件");

    }

    public void windowDeactivated(WindowEvent e) {

    System.out.println("windowDeactivated---窗体停用事件");

    }

    public void windowClosing(WindowEvent e) {

    System.out.println("windowClosing---窗体正在关闭事件");

    ((Window) e.getComponent()).dispose();

    }

    public void windowClosed(WindowEvent e) {

    System.out.println("windowClosed---窗体关闭事件");

    }

    public void windowActivated(WindowEvent e) {

    System.out.println("windowActivated---窗体激活事件");

    }

    });

    }

    }

    /*

    输出

    windowClosing---窗体正在关闭事件

    windowDeactivated---窗体停用事件

    windowClosed---窗体关闭事件

    */

    效果图:

    2. 鼠标事件

    在图形用户界面中, 用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件(MouseEvent),其中包括鼠标按下、鼠标松开、鼠标单击等。JDK 中提供了一个 MouseEvent 类用于表示鼠标事件,几乎所有的组件都可以产生鼠标事件。处理鼠标事件时,首先需要实现 MouseListener 接口定义监听器(也可以通过继承适配器 MouseAdapter类来实现),然后调用 addMouseListener() 方法将监听器绑定到事件源对象;java.awt.event.MouseEvent,详见:Class MouseEvent;监听器捕捉鼠标在按钮上的移动和单击:

    import java.awt.*;

    import java.awt.event.MouseEvent;

    import java.awt.event.MouseListener;

    public class Test {

    public static void main(String[] args) {

    final Frame f = new Frame("Regino");

    // 为窗口设置布局

    f.setLayout(new FlowLayout());

    f.setSize(300, 200);

    f.setLocation(300, 200);

    f.setVisible(true);

    Button but = new Button("Button"); // 创建按钮对象

    f.add(but); // 在窗口添加按钮组件

    // 为按钮添加鼠标事件监听器

    but.addMouseListener(new MouseListener() {

    public void mouseReleased(MouseEvent e) {

    System.out.println("mouseReleased-鼠标放开事件");

    }

    public void mousePressed(MouseEvent e) {

    System.out.println("mousePressed-鼠标按下事件");

    }

    public void mouseExited(MouseEvent e) {

    System.out.println("mouseExited—鼠标移出按钮区域事件");

    }

    public void mouseEntered(MouseEvent e) {

    System.out.println("mouseEntered—鼠标进入按钮区域事件");

    }

    public void mouseClicked(MouseEvent e) {

    System.out.println("mouseClicked-鼠标完成单击事件");

    if(e.getButton()==e.BUTTON1){

    System.out.println("鼠标左键点击");

    }

    if(e.getButton()==e.BUTTON3){

    System.out.println("鼠标右键点击");

    }

    if(e.getButton()==e.BUTTON2){

    System.out.println("鼠标中键点击");

    }

    }

    });

    }

    }

    /*

    输出

    mouseEntered—鼠标进入按钮区域事件

    mousePressed-鼠标按下事件

    mouseReleased-鼠标放开事件

    mouseClicked-鼠标完成单击事件

    鼠标左键点击

    mouseExited—鼠标移出按钮区域事件

    */

    效果图:

    3. 键盘事件

    键盘操作也是最常用的用户交互方式,例如键按下、释放等,这些操作被定义为键盘事件(KeyEvent)。JDK 中提供了一个 KeyEvent 类表示键盘事件,处理 KeyEvent 事件的监听器对象需要实现 KeyListener 接口或者继承 KeyAdapter 类;java.awt.event.KeyEvent,详见:Class KeyEvent;监听键盘事件:

    import java.awt.*;

    import java.awt.event.KeyAdapter;

    import java.awt.event.KeyEvent;

    public class Test {

    public static void main(String[] args) {

    Frame f = new Frame("Regino");

    f.setLayout(new FlowLayout());

    f.setSize(400, 300);

    f.setLocation(300, 200);

    TextField tf = new TextField(30); // 创建文本框对象

    f.add(tf); // 在窗口中添加文本框组件

    f.setVisible(true);

    // 为文本框添加键盘事件监听器

    tf.addKeyListener(new KeyAdapter() {

    public void keyPressed(KeyEvent e) {

    int KeyCode = e.getKeyCode(); // 返回所按键对应的整数值

    String s = KeyEvent.getKeyText(KeyCode); // 返回按键的字符串描述

    System.out.print("输入的内容为:" + s + ",");

    System.out.println("对应的KeyCode为:" + KeyCode);

    }

    });

    }

    }

    /*

    输出

    输入的内容为:Shift,对应的KeyCode为:16

    输入的内容为:Backspace,对应的KeyCode为:8

    输入的内容为:Shift,对应的KeyCode为:16

    输入的内容为:R,对应的KeyCode为:82

    输入的内容为:E,对应的KeyCode为:69

    输入的内容为:G,对应的KeyCode为:71

    输入的内容为:I,对应的KeyCode为:73

    输入的内容为:N,对应的KeyCode为:78

    输入的内容为:O,对应的KeyCode为:79

    */

    效果图:

    4. 动作事件

    动作事件(ActionEvent)与前面 3 种事件有所不同,它不代表某个具体的动作,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。在这里不需要关心使用哪种方式关闭文件,只要对关闭按钮进行操作,就会触发了动作事件。在 Java 中,动作事件用 ActionEvent 类表示,处理 ActionEvent 事件的监听器对象需要实现 ActionListener 接口。 监听器对象在监听动作时,不会像鼠标事件一样处理鼠标的移动和单击的细节,而是处理类似于 “按钮按下” 这样 “有意义” 的事件;java.awt.event.ActionEvent,详见:Class ActionEvent;利用 ActionEvent 事件实现扑克牌的逐一显示:

    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    class ComponentWithActionEvent extends JFrame implements ActionListener// 实现动作监视器接口

    {// 创建一个窗口界面

    JButton button_up, button_down, button_first, button_last;// 声明所需的按钮组件

    JLabel label1, label2, label3;// 声明所需的JLabel组件

    JPanel panel;// 声明一个JPanel容器,用于图片的载入和显示

    CardLayout card;// 声明一个CardLayout布局管理器,用于组件的叠加存放

    public ComponentWithActionEvent() {

    button_up = new JButton("上一张");

    button_down = new JButton("下一张");

    button_first = new JButton("第一张");

    button_last = new JButton("最后一张");

    label1 = new JLabel();// 创建JLabel,用于装入图片

    label2 = new JLabel();

    label3 = new JLabel();

    label1.setIcon(new ImageIcon("C:\\Users\\80626\\Desktop\\2.png"));// 将图片加入label,实现图片的显示

    label2.setIcon(new ImageIcon("C:\\Users\\80626\\Desktop\\3.png"));

    label3.setIcon(new ImageIcon("C:\\Users\\80626\\Desktop\\4.png"));

    panel = new JPanel();// 创建一个JPanel容器,用于载入各个JLabel组件

    card = new CardLayout();// 将JPanel容器的布局管理器设为CardLayout,

    panel.setLayout(card);// 实现图片的逐一显示

    panel.add(label1);// 将各个JLabel组件加入到JPanel容器

    panel.add(label2);

    panel.add(label3);

    card.first(panel);

    add(panel, BorderLayout.CENTER);// 将JPanel容器加入到窗口的中间位置

    add(button_up, BorderLayout.WEST);// 将各个按钮组件加入到窗口的指定位置

    add(button_down, BorderLayout.EAST);

    add(button_first, BorderLayout.NORTH);

    add(button_last, BorderLayout.SOUTH);

    button_up.addActionListener(this);// 注册监视器。用当前对象this作监视器,

    button_down.addActionListener(this);// 因为当前对象所在的类实现了ActionEvent

    button_first.addActionListener(this);// 接口,所以它可以作监视器

    button_last.addActionListener(this);

    setTitle("Regino");

    setSize(260, 260);

    setVisible(true);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    // actionPerformed是ActionEvent接口中的方法,必须定义

    // 当事件发生后,该方法就会被调用,并将事件对象传递给参数e

    public void actionPerformed(ActionEvent e) {// 一个监视器同时监视4个按钮,所以要判断是哪一个事件源产生的事件

    if (e.getSource() == button_up)// 监听up按钮,显示上一张图片

    card.previous(panel);

    else if (e.getSource() == button_down)// 监听down按钮,显示上一张图片

    card.next(panel);

    else if (e.getSource() == button_first)// 监听first按钮,显示第一张图片

    card.first(panel);

    if (e.getSource() == button_last)// 监听last按钮,显示最后一张图片

    card.last(panel);

    }

    }

    public class Test {

    public static void main(String[] args) {

    new ComponentWithActionEvent();

    }

    }

    效果图:

    5. 选项事件

    选项事件(ItemEvent)类用于表示选项事件。产生 ItemEvent 事件的事件源有复选框(JCheckBox)、下拉列表框(JComboBox)、菜单项(JMenuItem)等。例如,当用户对复选框 JCheckBox 进行操作时,当 JChenkBox 从未选中状态变成选中状态时就会触发改事件;java.awt.event.ItemEvent,详见:Class ItemEvent;设计一个图形用户界面, 界面中有编辑域(JTextField)、按钮(JButton)、复选框(JCheckBox)和下拉列表框(JComboBox)等组件,设置相应的监听器对组件进行监听,并将监听结果显示在 TextArea 中:

    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.ItemEvent;

    import java.awt.event.ItemListener;

    class FrameWithItemEvent extends JFrame implements ItemListener {// 定义一个窗口,继承并实现ItemListener接口

    JTextField text;

    JButton button;

    JCheckBox checkBox1, checkBox2, checkBox3;

    JRadioButton radio1, radio2;

    ButtonGroup group;

    JComboBox comBox;

    JTextArea area;

    public void display() {

    setLayout(new FlowLayout());

    add(new JLabel("文本框:"));

    text = new JTextField(10);

    add(text);

    add(new JLabel("按钮:"));

    button = new JButton("确定");

    add(button);

    add(new JLabel("选择框:"));

    checkBox1 = new JCheckBox("喜欢音乐");

    checkBox2 = new JCheckBox("喜欢旅游");

    checkBox3 = new JCheckBox("喜欢篮球");

    checkBox1.addItemListener(this);// 注册监听器,监听JcheckBox组件

    checkBox2.addItemListener(this);

    checkBox3.addItemListener(this);

    add(checkBox1);

    add(checkBox2);

    add(checkBox3);

    add(new JLabel("单选按钮:"));

    group = new ButtonGroup();

    radio1 = new JRadioButton("男");

    radio2 = new JRadioButton("女");

    group.add(radio1);

    group.add(radio2);

    add(radio1);

    add(radio2);

    add(new JLabel("下拉列表:"));

    comBox = new JComboBox();

    comBox.addItem("请选择");

    comBox.addItem("音乐天地");

    comBox.addItem("武术天地");

    comBox.addItem("象棋乐园");

    comBox.addItemListener(this);// 注册监听器,监听JComboBox组件

    add(comBox);

    add(new JLabel("文本区:"));

    area = new JTextArea(6, 12);

    add(new JScrollPane(area));

    setSize(300, 300);

    setVisible(true);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public void itemStateChanged(ItemEvent e) {// 重写itemStateChange方法,实现监听的处理

    if (e.getItem() == checkBox1) {// 如果监听到的对象是checkBox1,显示对象内容和选择状态

    String str = checkBox1.getText() + checkBox1.isSelected();

    area.append(str + "\n");

    } else if (e.getItemSelectable() == checkBox2) {// 如果监听到的对象是checkBox2,显示对象内容和选择状态

    String str = checkBox2.getText() + checkBox2.isSelected();

    area.append(str + "\n");

    } else if (e.getSource() == checkBox3) {// 如果监听到的对象是checkBox3,显示对象内容和选择状态

    String str = checkBox3.getText() + checkBox3.isSelected();

    area.append(str + "\n");

    } else if (e.getItemSelectable() == comBox) {// 如果监听到的对象是comBox,显示当前选择的内容

    if (e.getStateChange() == ItemEvent.SELECTED) {

    String str = comBox.getSelectedItem().toString();

    area.append(str + "\n");

    }

    }

    }

    }

    public class Test {

    public static void main(String[] args) {

    new FrameWithItemEvent().display();

    }

    }

    效果图:

    6. 焦点事件

    焦点事件(FocusEvent) 类用于表示焦点事件。每个 GUI 组件都能够作为 FocusEvent 焦点事件的事件源,也就是每个组件在获得焦点或者失去焦点的时候都会产生焦点时间;java.awt.event.FocusEvent,详见:Class FocusEvent;

    类型方法说明构造方法addFocusListener(FocusListener listener)事件源注册监听器voidfocusGained(FocusEvent e)FocusEvent 接口实现焦点事件的监听,从无焦点变成有焦点voidfocusLost(FocusEvent e)FocusEvent 接口实现焦点事件的监听,从有焦点变成无焦点ComponentgetOppositeComponent()获得此焦点变更的另一组件 Component,对于 FOCUS_GAINED 事件返回的组件是失去当前焦点的组件,对于 FOCUS_GAINED 事件返回的组件是获得当前焦点的组件booleanisTemporary()获得焦点变更的级别,如果焦点变更是暂时性的(例如拖动窗口时失去焦点,拖放结束又自动恢复焦点)返回 true,否则返回 false

    7. 文档事件

    文档事件(DocumentEvent)接口用于处理文档事件。能够产生 javax.swing.event.DocumentEvent 事件的事件源有文本框(JTextField)、密码框(JPasswordField)、文本区(JTextArea)。这些组件不能直接触发 DocumentEvent 事件,而是由组件对象调用 getDocument() 方法获取文本区维护文档,这个维护文档可以触发 DocumentEvent 事件;DocumentEvent 不是类,而是一个接口,位于 javax.swing.event 包中,详见:Interface DocumentEvent;

    类型方法说明构造方法addDocumentListener(DocumentListener listener)事件源注册监听器voidchangedUpdate(DocumentEvent e)DocumentListener 接口实现文本事件的监听,文本区内容改变voidremoveUpdate(DocumentEvent e)DocumentListener 接口实现文本事件的监听,文本区左删除式修改操作voidinsertUpdate(DocumentEvent e)DocumentListener 接口实现文本事件的监听,文本区做插入式修改DocumentgetDocument()获得发起更改事件的文档Document.EventTypegetType()获得事件类型intgetOffset()获得文档中更改开始的偏移量intgetLength()获得更改的长度