
在 swing 中,自定义图形的绘制主要通过重写 jpanel 的 paintcomponent(graphics g) 方法来完成。当需要图形响应用户交互(如鼠标移动)时,我们通常会:
然而,一个常见的错误是,即使在事件处理方法中更新了位置变量,但在 paintComponent 方法中,图形的绘制坐标仍然是硬编码的固定值,而不是基于这些更新后的变量。这就导致了图形始终停留在初始位置,无法跟随鼠标移动。
要解决此问题,核心在于将图形的绘制逻辑与鼠标事件更新的坐标变量紧密关联。具体步骤如下:
下面是修正后的 SmileyFace 类代码,它演示了如何正确实现一个跟随鼠标移动的动态笑脸:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SmileyFace extends JPanel implements MouseMotionListener {
private int x = 100; // 笑脸的初始X坐标(左上角)
private int y = 100; // 笑脸的初始Y坐标(左上角)
private static final int SMILEY_DIAMETER = 200; // 笑脸的直径
private static final int SMILEY_RADIUS = SMILEY_DIAMETER / 2; // 笑脸的半径
public SmileyFace() {
// 设置面板的首选大小,确保有足够的空间显示笑脸
setPreferredSize(new Dimension(400, 400));
// 将MouseMotionListener添加到面板自身
addMouseMotionListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 调用父类的paintComponent,清除背景
// 绘制笑脸
// 1. 绘制脸部背景(黄色圆)
g.setColor(Color.YELLOW);
g.fillOval(x, y, SMILEY_DIAMETER, SMILEY_DIAMETER);
// 2. 绘制脸部轮廓(黑色圆)
g.setColor(Color.BLACK);
g.drawOval(x, y, SMILEY_DIAMETER, SMILEY_DIAMETER);
// 3. 绘制眼睛(两个小黑点)
// 左眼:相对于笑脸左上角 (x, y) 进行偏移
g.fillOval(x + SMILEY_DIAMETER / 4, y + SMILEY_DIAMETER / 4, SMILEY_DIAMETER / 10, SMILEY_DIAMETER / 10);
// 右眼:相对于笑脸左上角 (x, y) 进行偏移
g.fillOval(x + SMILEY_DIAMETER * 3 / 4 - SMILEY_DIAMETER / 10, y + SMILEY_DIAMETER / 4, SMILEY_DIAMETER / 10, SMILEY_DIAMETER / 10);
// 4. 绘制嘴巴(弧形)
// 嘴巴的外接矩形左上角坐标,相对于笑脸左上角 (x, y) 偏移
g.drawArc(x + SMILEY_DIAMETER / 4, y + SMILEY_DIAMETER * 2 / 3,
SMILEY_DIAMETER / 2, SMILEY_DIAMETER / 5, 0, -180); // 从0度到-180度绘制一个下弧
}
@Override
public void mouseDragged(MouseEvent e) {
// 当鼠标拖动时,更新笑脸的坐标
// 调整 x, y 使鼠标指针位于笑脸的中心
x = e.getX() - SMILEY_RADIUS;
y = e.getY() - SMILEY_RADIUS;
repaint(); // 请求重绘组件
}
@Override
public void mouseMoved(MouseEvent e) {
// 当鼠标移动时,更新笑脸的坐标
// 调整 x, y 使鼠标指针位于笑脸的中心
x = e.getX() - SMILEY_RADIUS;
y = e.getY() - SMILEY_RADIUS;
repaint(); // 请求重绘组件
}
public static void main(String[] args) {
// 在主方法中创建并显示窗口
JFrame frame = new JFrame("跟随鼠标的动态笑脸");
SmileyFace smileyPanel = new SmileyFace();
frame.add(smileyPanel); // 将笑脸面板添加到窗口
frame.pack(); // 根据组件的首选大小调整窗口大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作
frame.setLocationRelativeTo(null); // 窗口居中显示
frame.setVisible(true); // 使窗口可见
}
}通过本教程,我们深入理解了在 Java Swing 中实现动态图形绘制的关键机制。核心在于:
掌握这些原则,您将能够创建各种响应用户交互的动态和交互式 Swing 图形界面应用。
以上就是使用 Swing 实现跟随鼠标的动态笑脸绘制的详细内容,更多请关注php中文网其它相关文章!
Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号