public class PaintUtil4 extends JPanel {
/**
* 动态图片+鼠标
*/
private static final long serialVersionUID = -5247450804494766145L;
private static BufferedImage image;
int y = 0;
int y1 = -600;
int fontx;
int fonty;
static {
image = loadImage("background.png");
}
/** 读取图片 */
public static BufferedImage loadImage(String fileName) {
try {
// 同包下读取图片
BufferedImage img = ImageIO.read(PaintUtil4.class.getResource(fileName));
return img;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
private void backgroundLogic() {
y += 5;
y1 += 5;
if (y >= 600) {
y = -600;
}
if (y1 >= 600) {
y1 = -600;
}
}
/** 启动程序的执行 */
public void action() {
// 侦听器对象
MouseAdapter l = new MouseAdapter() {
/** 重写mouseMoved()鼠标移动 */
public void mouseMoved(MouseEvent e) {
fontx = e.getX(); // 获取鼠标的x坐标
fonty = e.getY(); // 获取鼠标的y坐标
}
/** 重写mouseClicked()鼠标点击 */
public void mouseClicked(MouseEvent e) {
}
/** 重写mouseExited()鼠标移出 */
public void mouseExited(MouseEvent e) {
}
/** 重写mouseEntered()鼠标移入 */
public void mouseEntered(MouseEvent e) {
}
};
this.addMouseListener(l); // 处理鼠标操作事件
this.addMouseMotionListener(l); // 处理鼠标滑动事件
Timer timer = new Timer(); // 定时器对象
int interval = 10; // 以毫秒为单位
timer.schedule(new TimerTask() {
public void run() { // 定时干的那个事(每10毫秒走一次)
backgroundLogic();
repaint(); // 重画(重新调用paint())
}
}, interval, interval); // 定时计划
}
/** 重写paint()画 g:画笔 */
public void paint(Graphics g) {
g.drawImage(image, 0, y, null);// 在坐标(0,0)处画图,先画图再写字,不然会覆盖
g.drawImage(image, 0, y1, null);// 在坐标(0,0)处画图,先画图再写字,不然会覆盖
g.setColor(Color.red);// 设置颜色
g.drawString("abcde", 111, 111);// 打字
g.drawString("ABCDE", fontx, fonty);
}
public static void main(String[] args) {
JFrame frame = new JFrame("打飞机");
PaintUtil4 pu = new PaintUtil4();// 要求PaintUtil4是继承 JPanel父类
frame.add(pu);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 600);
frame.setLocationRelativeTo(null); // 中间
frame.setVisible(true); // 1)设计窗口可见 2)尽快调用paint()
pu.action();// 执行才会动态
}
}
结果:背景图向下移动,ABCDE字母随鼠标移动