Java AWT 常用事件


常用事件

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---窗体关闭事件
 */
  • 效果图:
    1

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—鼠标移出按钮区域事件
 */
  • 效果图:
    2

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
 */
  • 效果图:
    3

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();
    }
}
  • 效果图:
    4

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();
    }
}
  • 效果图:
    5

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()获得更改的长度
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值