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) 事件源注册监听器
void focusGained(FocusEvent e) FocusEvent 接口实现焦点事件的监听,从无焦点变成有焦点
void focusLost(FocusEvent e) FocusEvent 接口实现焦点事件的监听,从有焦点变成无焦点
Component getOppositeComponent() 获得此焦点变更的另一组件 Component,对于 FOCUS_GAINED 事件返回的组件是失去当前焦点的组件,对于 FOCUS_GAINED 事件返回的组件是获得当前焦点的组件
boolean isTemporary() 获得焦点变更的级别,如果焦点变更是暂时性的(例如拖动窗口时失去焦点,拖放结束又自动恢复焦点)返回 true,否则返回 false

7. 文档事件

  • 文档事件(DocumentEvent)接口用于处理文档事件。能够产生 javax.swing.event.DocumentEvent 事件的事件源有文本框(JTextField)、密码框(JPasswordField)、文本区(JTextArea)。这些组件不能直接触发 DocumentEvent 事件,而是由组件对象调用 getDocument() 方法获取文本区维护文档,这个维护文档可以触发 DocumentEvent 事件;
  • DocumentEvent 不是类,而是一个接口,位于 javax.swing.event 包中,详见:Interface DocumentEvent
类型 方法 说明
构造方法 addDocumentListener(DocumentListener listener) 事件源注册监听器
void changedUpdate(DocumentEvent e) DocumentListener 接口实现文本事件的监听,文本区内容改变
void removeUpdate(DocumentEvent e) DocumentListener 接口实现文本事件的监听,文本区左删除式修改操作
void insertUpdate(DocumentEvent e) DocumentListener 接口实现文本事件的监听,文本区做插入式修改
Document getDocument() 获得发起更改事件的文档
Document.EventType getType() 获得事件类型
int getOffset() 获得文档中更改开始的偏移量
int getLength() 获得更改的长度
发布了242 篇原创文章 · 获赞 244 · 访问量 9585

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104744504
AWT
今日推荐