Java实现窗体爱心移动特效

在整个窗体上进行爱心移动并且不影响鼠标操作其他的软件

1.先创建窗体的外壳(就像门框)代码:

package com.jerry.classs;

import java.awt.Toolkit;

import javax.swing.JFrame;

import com.sun.awt.AWTUtilities;

/**
 * Java中表示窗体的类:JFrame 步骤: 1.写一个类,继承JFrame 2.写一个构造方法,确定窗体的形状
 * 
 * @author jerry
 *
 */
public class GameFrame extends JFrame {
    //获取系统当前分辨率的宽度
    static int width = Toolkit.getDefaultToolkit().getScreenSize().width;
    //获取系统当前分辨率的高度
    static int height = Toolkit.getDefaultToolkit().getScreenSize().height;

    /**
     * 构造方法:类似于模具 给窗体定型
     */
    public GameFrame() {
        //设置标题
        setTitle("爱心");
        //设置尺寸(大小)
        //setSize(宽度, 高度);
        setSize(width, height);
        //设置默认的关闭选项(每次制作窗体必须的加)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //隐藏标题栏
        setUndecorated(true);
        //让特效一直显示在屏幕的顶端
        setAlwaysOnTop(true);
        //让窗体不遮盖桌面(程序运行时可以点击桌面的图标)
        AWTUtilities.setWindowOpaque(this, false);//固定的套路
    }

    public static void main(String[] args) {
        //创建窗体
        GameFrame frame = new GameFrame();
        //创建面板
        GamePanel panel = new GamePanel();
        //将面板加入窗体
        frame.add(panel);
        //让窗体显示
        //true表示显示,false表示隐藏
        frame.setVisible(true);
    }
}


2.创建窗体的面板窗体的装饰(就像门)代码:

package com.jerry.classs;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

/***
 * Java中的面板:Panel 步骤: 1.写一个类,继承JPanel 2.写一个构造方法,确定面板的特点
 * 
 * @author jerry
 *
 */
public class GamePanel extends JPanel {
    private static final long serialVersionUID = 1L;
    int num = 300;//代表屏幕中文字的数量
    //定义数组,用来存放所有文字的横坐标
    int[] xs = new int[num];
    //定义数组,用来存放所有文字的纵坐标
    int[] ys = new int[num];
    //定义颜色数组,用来存放所有文字的颜色
    Color[] cs = new Color[num];
    //定义数组,用来存放所有文字的大小
    int[] fs = new int[num];
    //定义数组,用来存放所有文字的移动熟读
    int[] sp = new int[num];
    //用来生成随机数的工具
    Random rd = new Random();
    //定义图片
    BufferedImage img;

    /**
     * 让文字活动
     */
    public void action() {

        //Java中创建并启动线程的固定格式
        //创建并启动一个线程去播放音乐
        new Thread() {
            public void run() {
                //重复播放音乐
                while (true) {
                    //创建音乐播放器
                    MusicPlayer player = new MusicPlayer("/music/bgm.mp3");
                    //开始播放音乐
                    player.startMusic();
                }
            }
        }.start();
        //创建并启动线程,控制文字移动
        new Thread() {
            public void run() {
                //while,死循环控制文字一直移动
                while (true) {
                    //遍历所有的文字,让文字移动起来
                    for (int i = 0; i < num; i++) {
                        //让文字的向左移动
                        xs[i] -= sp[i];
                        //如果横坐标小于等于0,移动到左边界
                        if (xs[i] <= 0) {
                            //让文字的横坐标等于屏幕宽度(文字出现在最右边)
                            xs[i] = GameFrame.width;
                        }
                    }
                    //让线程休眠
                    try {
                        //每移动一次休眠的毫秒数
                        Thread.sleep(15);
                        //刷新界面,将文字画在新的位置上
                        repaint();//重新调用paint方法,绘制界面
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    /**
     * 面板设置
     */
    public GamePanel() {
        //加载图片
        try {
            img = ImageIO.read(this.getClass().getResource("/img/img.png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //启动文字移动
        action();
        //设置面板的背景颜色
        //setBackground(Color.black);
        //循环,随机出所有文字的横纵坐标
        for (int i = 0; i < num; i++) {
            //随机生成所有的横坐标,并放入横坐标的数组中
            //rd.nextInt(num);表示在表示在[0,num)区间随机生成整数
            xs[i] = rd.nextInt(GameFrame.width);
            //随机生成所有的横坐标,并放入纵坐标的数组中
            //rd.nextInt(num);表示在表示在[0,num)区间随机生成整数
            ys[i] = rd.nextInt(GameFrame.height);
            //随机颜色
            cs[i] = new Color(rd.nextInt(255), rd.nextInt(255), rd.nextInt(255));
            //随机字体大小
            fs[i] = rd.nextInt(30) + 1;
            //随机文字速度
            sp[i] = rd.nextInt(10) + 1;
        }
        //让背景透明
        setOpaque(false);
    }

    /**
     * 画图专用方法
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);

        for (int i = 0; i < num; i++) {
            //设置画笔颜色(从颜色数组中获取)
            g.setColor(cs[i]);
            //设置画笔字体
            //new Font("字体名称",字体样式,字体大小)
            g.setFont(new Font("华文新魏", Font.BOLD, fs[i]));
            //画图片g.drawImage(图片, 横坐标,纵坐标, 宽度,高度,null);
            g.drawImage(img, xs[i], ys[i], fs[i] * 2, fs[i] * 2, null);
            //画文字g.drawString("文字内容",横坐标,纵坐标)
            //g.drawString("★I LOVE YOU", xs[i], ys[i]);//可以图片和文字一起显示
        }
    }
}


3.创建音乐播放组件 代码:

package com.jerry.classs;

import java.io.BufferedInputStream;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

/**
 * 播放音乐的
 * 
 * @author jerry
 *
 */
public class MusicPlayer {
    //音乐的播放组件
    Player player;

    /**
     * 设置音乐播放器
     */
    public MusicPlayer(String path) {
        //使用IO流将背景音乐加载到程序中
        BufferedInputStream ins = new BufferedInputStream(this.getClass().getResourceAsStream(path));
        //将音乐流输入到播放器组件中
        try {
            player = new Player(ins);
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 开始播放音乐
     */
    public void startMusic() {
        //播放音乐
        try {
            player.play();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }
    }

}


代码链接:https://pan.baidu.com/s/1L2-0puBQaEJ37Kyv-t24RQ 
提取码:vsw1

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值