Java中的事件处理:鼠标、键盘事件及高级应用示例
立即解锁
发布时间: 2025-08-21 00:49:27 阅读量: 4 订阅数: 9 


Java编程入门与实践
### Java 中的事件处理:鼠标、键盘事件及高级应用示例
#### 1. 鼠标事件处理
计算机的鼠标会触发鼠标事件(MouseEvents),鼠标事件主要分为两种类型:
- **鼠标移动事件**:由鼠标移动触发。
- **常规鼠标事件**:通过点击鼠标按钮或鼠标移入、移出监听器区域触发。
这两种事件对应两个监听器类:
- **MouseListener**:监听鼠标按钮触发的事件以及鼠标进入和离开事件。
- **MouseMotionListener**:监听鼠标的移动(指针位置变化)和拖动(鼠标按键按下时移动)事件。
`javax.swing.event` 包中的 `MouseInputListener` 是 `MouseListener` 和 `MouseMotionListener` 的子接口,可用于监听所有类型的鼠标事件。
下面是一个 `MouseTest` 应用程序的示例代码,它实现了 `MouseListener` 和 `MouseMotionListener` 接口来捕获鼠标事件:
```java
/*
* MouseTest
* Demonstrates the MouseListener and MouseMotionListener interfaces
*/
import java.awt.*;
import java.awt.event.*;
public class MouseTest extends GUIFrame
implements MouseListener, MouseMotionListener {
Canvas canvas;
Label location, event;
public MouseTest() {
super("Mouse Event Test");
canvas = new Canvas();
canvas.setBackground(Color.white);
canvas.setSize(450, 450);
canvas.addMouseListener(this);
canvas.addMouseMotionListener(this);
add(canvas, BorderLayout.CENTER);
Panel infoPanel = new Panel();
infoPanel.setLayout(new GridLayout(0, 2, 10, 0));
location = new Label("Location:");
infoPanel.add(location);
event = new Label("Event:");
infoPanel.add(event);
add(infoPanel, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public static void main(String args[]) {
new MouseTest();
}
//The five MouseListener methods...
public void mouseClicked(MouseEvent me) {
String text = "Event: Clicked Button ";
switch(me.getModifiers()) {
case (InputEvent.BUTTON1_MASK):
text += "1";
break;
case (InputEvent.BUTTON2_MASK):
text += "2";
break;
case (InputEvent.BUTTON3_MASK):
text += "3";
break;
default:
text += "?";
}
text += " (" + me.getClickCount() + "x)";
event.setText(text);
}
public void mouseEntered(MouseEvent me) {
event.setText("Event: Entered");
}
public void mouseExited(MouseEvent me) {
event.setText("Event: Exited");
}
public void mousePressed(MouseEvent me) {
event.setText("Event: Pressed");
}
public void mouseReleased(MouseEvent me) {
event.setText("Event: Released");
}
//The two MouseMotionListener methods...
public void mouseMoved(MouseEvent me) {
Point p = me.getPoint();
location.setText("Location: (" + p.x + ", " + p.y + ")");
}
public void mouseDragged(MouseEvent me) {
Point p = me.getPoint();
event.setText("Event: Dragged");
location.setText("Location: (" + p.x + ", " + p.y + ")");
}
}
```
`MouseTest` 对象将自身作为 `MouseListener` 和 `MouseMotionListener` 添加到 `Canvas` 上,并重写了监听器方法以在屏幕上显示鼠标光标的当前位置和当前事件。
`MouseEvent` 的常用方法如下表所示:
| 方法 | 描述 |
| ---- | ---- |
| `int getClickCount()` | 返回连续鼠标点击的次数。 |
| `Point getPoint()` | 返回一个表示相对于源组件的光标位置的 `Point` 对象。 |
| `int getX()` | 返回位置点的水平部分。 |
| `int getY()` | 返回位置点的垂直部分。 |
`MouseListener` 和 `MouseMotionListener` 的方法如下表所示:
| 方法 | 监听器 | 描述 |
| ---- | ---- | ---- |
| `void mouseClicked(MouseEvent)` | `MouseListener` | 当鼠标在组件上点击(按下并释放)时调用。 |
| `void mouseEntered(MouseEvent)` | `MouseListener` | 当鼠标光标进入源组件区域时调用。 |
| `void mouseExited(MouseEvent)` | `MouseListener` | 当鼠标光标离开源组件区域时调用。 |
| `void mousePressed(MouseEvent)` | `MouseListener` | 当鼠标按钮按下时调用。 |
| `void mouseReleased(MouseEvent)` | `MouseListener` | 当鼠标按钮释放时调用。 |
| `void mouseMoved(MouseEvent)` | `MouseMotionListener` | 当鼠标在组件区域内移动时调用。 |
| `void mouseDragged(MouseEvent)` | `MouseMotionListener` | 当鼠标在组件区域内按下按钮并移动时调用。 |
#### 2. 键盘事件处理
键盘事件(KeyEvents)由用户的键盘操作触发。`KeyListener` 接口定义了三个方法,如下表所示:
| 方法 | 描述 |
| ---- | ---- |
| `void keyPressed(KeyEvent)` | 当按键按下时调用。 |
| `void keyReleased(KeyEvent)` | 当按键释放时调用。 |
| `void keyTyped(KeyEvent)` | 当按键被键入时调用。 |
`addKeyListener(KeyListener)` 方法在 `Component` 类中定义,因此所有组件都可以处理键盘事件。`KeyEvent` 类有大量的静态整数常量,代表不同类型键盘的可能按键。这些常量通常以 `VK` 开头,后面跟着下划线和按键的字符串表示。
下面是一个 `KeyTest` 应用程序的示例代码,用于测试键盘事件的处理:
```java
/*
* KeyTest
* Demonstrates handling key events
*/
import java.awt.*;
import java.awt.event.*;
public class KeyTest extends GUIFrame
implements KeyListener {
TextArea textArea;
Label pressed, released, typed;
String lastPressedText;
public KeyTest() {
super("KeyListener Test");
textArea = new TextArea(10, 30);
textArea.addKeyListener(this);
add(textArea, BorderLayout.CENTER);
Panel infoPanel = new Panel();
infoPanel.setLayout(new GridLayout(3, 0, 0, 10));
pressed = new Label("Last Pressed: <none>");
infoPanel.add(pressed);
released = new Label("Last Released: <none>");
infoPanel.add(released);
typed = new Label("Last Typed: <none>");
infoPanel.add(typed);
add(infoPanel, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public static void main(String args[]) {
new KeyTest();
}
public void keyPressed(KeyEvent e) {
lastPressedText = e.getKeyModifiersText(e.getModifiers())
+ " " + KeyEvent.getKeyText(e.getKeyCode());
pressed.setText("Last Pressed: "
+ KeyEvent.getKeyText(e.getKeyCode()));
}
public void keyReleased(KeyEvent e) {
released.setText("Last Released: "
+ KeyEvent.getKeyText(e.getKeyCode()));
}
public void keyTyped(KeyEvent e) {
typed.setText("Last Typed: " + lastPressedText);
}
}
```
`KeyTest` 应用程序将自身作为 `KeyListener` 添加到 `TextArea` 上,并更新三个标签以显示按键按下、释放或键入的事件。
`KeyEvent` 的常用方法如下表所示:
| 方法 | 描述 |
| ---- | ---- |
| `char getKeyChar()` | 返回与按键关联的字符。 |
| `int getKeyCode()` | 返回按键的整数表示。 |
| `String getKeyModifiersText(int)` | 根据给定的修饰符整数表示返回修饰键(如 `Ctrl`)的字符串表示。 |
| `String getKeyText(int)` | 根据给定的键码返回按键的字符串表示。 |
#### 3. 高级 MadLib 应用程序
高级 MadLib 应用程序综合运用了布局管理器和事件处理。它使用布局管理器来布局其组件,包括 `CardLayout`,并使用事件处理来处理按钮点击和 `Choice` 菜单选择事件。
##### 3.1 创建 `MadInputPanel` 类
`MadInputPanel` 类负责所有用户文本输入。它有三个 `Panel`,使用 `CardLayout` 布局管理器进行布局。每个 `Panel` 用于获取不同类型的输入,分别是名词、动词和其他类型的单词。每个卡片都有自己的 `TextField` 数组。
下面是 `MadInputPanel` 类的示例代码:
```java
/*
* MadInputPanel
* The AdvancedMadLib game's input panel.
* All input is accepted here
*/
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class MadInputPanel extends Panel {
protected GridBagLayout gridbag;
protected GridBagConstraints constraints;
protected CardLayout cards;
protected Panel nouns, verbs, others;
protected TextField[] nFields, vFields, oFields;
public MadInputPanel() {
super();
gridbag = new GridBagLayout();
constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.WEST;
cards = new CardLayout();
setLayout(cards);
//Nouns
nouns = new Panel();
nouns.setLayout(gridbag);
addComponent(nouns, new Label("Enter some nouns:"));
nFields = new TextField[8];
//put all noun fields in the second column
constraints.gridx = 1;
constraints.gridy = GridBagConstraints.RELATIVE;
for (int n=0; n < nFields.length; n++) {
nFields[n] = new TextField(20);
addComponent(nouns, nFields[n]);
}
add("Nouns", nouns);
//Verbs
verbs = new Panel();
verbs.setLayout(gridbag);
constraints.gridx = constraints.gridy = 0;
addComponent(verbs, new Label("Enter some verbs:"));
vFields = new TextField[8];
//put all verb Fields in the second column
constraints.gridx = 1;
constraints.gridy = GridBagConstraints.RELATI
```
0
0
复制全文
相关推荐










