目录
- 常用事件
- 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) | 事件源注册监听器 |
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() | 获得更改的长度 |