Java Swing 鼠标事件监听实战:追踪鼠标位置
一、原题完整代码呈现
以下是Java Swing中关于鼠标移动事件监听的典型题型,通过面板实时显示鼠标当前位置,包含3处需要填写的空白(标记为//*********Found**********
):
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Java_3 {
public static void main(String[] args) {
JFrame frame = new JFrame("Mouse Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new MousePanel());
frame.pack();
frame.setVisible(true);
}
}
//*********Found**********
class ___________ extends JPanel {
private JLabel b;
public MousePanel() {
b = new JLabel(" 起始状态 ");
setLayout(new BorderLayout());
add(b, BorderLayout.SOUTH);
addMouseMotionListener(new MouseMotion());
setPreferredSize(new Dimension(300, 200));
}
//*********Found**********
private class MouseMotion extends ___________ {
public void mouseMoved(MouseEvent e) {
//*********Found**********
b.setText(" 鼠标当前位置: "+ e._________+ " , " + e.__________);
}
}
}
二、空白处逐一解析与解答
1. 第一处空白:自定义面板类的类名
答案:MousePanel
//*********Found**********
class MousePanel extends JPanel {
解析:
在main
方法中,程序通过frame.getContentPane().add(new MousePanel())
添加了一个面板实例,说明存在名为MousePanel
的类,且该类继承JPanel
(用于创建自定义面板)。因此此处应填写MousePanel
。
2. 第二处空白:鼠标移动监听器的父类/接口
答案:MouseMotionAdapter
//*********Found**********
private class MouseMotion extends MouseMotionAdapter {
解析: addMouseMotionListener(MouseMotionListener l)
方法需要接收MouseMotionListener
接口的实现类。MouseMotionAdapter
是该接口的适配器类(空实现所有方法),通过继承它可以只重写需要的方法(如mouseMoved
),避免实现接口时必须重写所有方法的冗余。因此此处填写MouseMotionAdapter
。
3. 第三处空白:获取鼠标坐标的方法
答案:getX()
和 getY()
//*********Found**********
b.setText(" 鼠标当前位置: "+ e.getX() + " , " + e.getY());
解析: MouseEvent
类提供了获取鼠标位置的方法:getX()
返回鼠标在组件中的x坐标,getY()
返回y坐标。此处需要在标签中显示这两个坐标,因此分别填写getX()
和getY()
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现了一个窗口,通过鼠标移动事件监听,在窗口底部的标签中实时显示鼠标在面板中的坐标位置,具体功能包括:
- 创建标题为“Mouse Demo”的窗口,添加自定义面板
MousePanel
; - 面板底部放置标签,初始显示“ 起始状态 ”;
- 监听鼠标在面板中的移动事件,实时更新标签内容为鼠标当前的(x,y)坐标。
运行说明
- 程序启动后,显示一个300×200的窗口,底部标签显示初始状态;
- 当鼠标在面板中移动时,标签实时更新为“ 鼠标当前位置: x , y ”(x为水平坐标,y为垂直坐标);
- 坐标原点(0,0)位于面板左上角,向右x增大,向下y增大;
- 关闭窗口时程序退出。
五、核心知识点总结
自定义面板类
- 通过
class MousePanel extends JPanel
创建自定义面板,继承JPanel
的所有属性和方法; - 面板中可添加组件(如
JLabel
),并设置布局(如BorderLayout
)和 preferredSize(通过setPreferredSize
设置面板默认大小)。
- 通过
鼠标事件监听机制
- 鼠标移动事件:属于
MouseMotionListener
接口管辖,包含mouseMoved
(鼠标移动)和mouseDragged
(鼠标拖拽)两个方法; - 适配器类:
MouseMotionAdapter
是MouseMotionListener
的适配器,提供了接口方法的空实现,继承它可以只重写需要的方法(如本例只重写mouseMoved
),简化代码; - 注册监听器:通过
addMouseMotionListener(监听器实例)
为面板注册鼠标移动监听器,使面板能响应鼠标移动事件。
- 鼠标移动事件:属于
MouseEvent类的坐标获取
getX()
:返回鼠标事件发生时,鼠标在源组件(本例中为MousePanel
)中的水平坐标;getY()
:返回垂直坐标;- 坐标体系:组件的左上角为原点(0,0),向右x递增,向下y递增。
Swing窗口基础
JFrame
:主窗口容器,通过setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
设置关闭窗口时退出程序;pack()
:根据组件的preferredSize自动调整窗口大小;setVisible(true)
:使窗口可见。
六、常见错误与应试技巧
常见错误分析
- 第一处空白类名错误:写成
MouseDemo
或其他名称(必须与main
方法中创建的实例new MousePanel()
一致); - 第二处空白父类错误:写成
MouseMotionListener
(直接实现接口需重写所有方法,而代码中只重写了mouseMoved
,会编译错误); - 第三处空白方法错误:写成
getX
和getY
(遗漏括号,方法调用需带()
,否则编译错误)或getXCoordinate()
(不存在该方法,正确方法为getX()
和getY()
)。
- 第一处空白类名错误:写成
应试技巧
- 自定义面板:“面板类名看实例,main方法中new的是谁,类名就是谁,继承JPanel不能忘”;
- 事件适配器:“鼠标移动用MouseMotionListener,适配器是MouseMotionAdapter,继承它只重写需要的方法”;
- 坐标获取:“鼠标位置用getX和getY,方法带括号,返回当前坐标值,实时更新到标签”。
通过本题,我们掌握了Swing中鼠标移动事件的监听机制、适配器类的使用及坐标获取方法。这些是Java GUI编程中处理用户交互的基础,理解并熟练运用这些知识点,能帮助我们实现更丰富的交互功能(如绘图、拖拽等)。