本文实现的功能有:
1、播放音乐
2、自定义流星数量、飞行速度、光晕大小、流星大小
3、自定义表白话语
运用到的知识点有:
GUI:java实现窗体、Swing。其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。
多线程:让cpu同一时间处理多个任务(本文中涉及到音乐、文字缓慢出现、流星线条移动)
效果图:

音乐类(其实也可以不用音乐,有些人并不喜欢):
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class MusicThread extends Thread{
@Override
public void run() {
//播放音乐
System.out.println("开始播放");
//表示音乐文件
File f = new File("nv.mp3");
//第三方jar包 Player类
try {
Player p = new Player(new FileInputStream(f));//参数:文件输入流对象
// p.play();
} catch (FileNotFoundException | JavaLayerException e) {
e.printStackTrace();
}
}
}
实现类:
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Random;
import javax.swing.*;
public class MeteorFly extends JFrame {
int AppletWidth, AppletHeight;
final int MAX = 6; // (~)流星的个数
final int SLEEP = 2; // 流星飞行的速度(数值越大,速度越慢)
final int COLORLV = 1; // (~)色阶(可改变光晕大小)
final int SIZE = 3 ; // (~)流星大小
private MyPanel panel;
public MeteorFly() {
panel = new MyPanel();
this.setTitle("LOVE");
this.getContentPane().add(panel);
this.setSize(AppletWidth, AppletHeight); // 创建窗体
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
//声明一个File对象
File mp3 = new File("nv.mp3");
//创建一个输入流
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(mp3);
//创建一个缓冲流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
//创建播放器对象,把文件的缓冲流传入进去
Player player = new Player(fileInputStream);
//调用播放方法进行播放
player.play();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JavaLayerException e) {
e.printStackTrace();
}
}
}.start();
new MeteorFly();
}
class MyPanel extends JPanel implements Runnable {
Meteor p[];
BufferedImage OffScreen;
Graphics drawOffScreen;
Thread pThread;
Font drawFont = new Font("Arial",0,28);
public MyPanel() {
//setBackground(Color.black); //窗体初始化
AppletWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
AppletHeight = Toolkit.getDefaultToolkit().getScreenSize().height-200;
p = new Meteor[MAX];
for (int i = 0; i < MAX; i++) {
p[i] = new Meteor();
}
OffScreen = new BufferedImage(AppletWidth, AppletHeight,
BufferedImage.TYPE_INT_BGR);
drawOffScreen = OffScreen.getGraphics();
pThread = new Thread(this);
pThread.start();
new Thread(){
@Override
public void run() {
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
str1 = "流星雨是世间宝藏,而你是我的人间理想";
while(true){
try {
sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
pos++;
if (pos > str1.length() - 1) {
pos = str1.length() - 1;
break;
}
}
}
}.start();
}
int pos = 0;
String str1 = " ";
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(OffScreen, 0, 0, this);
g.setColor(Color.pink);
g.setFont(new Font("宋体", Font.BOLD, 50));
g.drawString(str1.substring(0,pos+1),260,700);
}
@Override
public void run() {
while (true) {
for (int i = 0; i < MAX; i++) {
drawOffScreen.setColor(p[i].color); // RGB颜色
drawOffScreen.fillOval(p[i].x, p[i].y, SIZE, SIZE);
p[i].x += p[i].mx;
p[i].y += p[i].my;
int x = p[i].x;
int y = p[i].y;
int R = p[i].color.getRed(); // 提取颜色
int G = p[i].color.getGreen();
int B = p[i].color.getBlue();
while (true) {
if (R ==0 && G ==0 && B ==0 ) {
break;
}
R -= COLORLV; // 尾部颜色淡化
if (R <0 ) {
R =0 ;
}
G -= COLORLV;
if (G <0 ) {
G =0 ;
}
B -= COLORLV;
if (B < 0) {
B =0 ;
}
Color color = new Color(R, G, B);
x -= p[i].mx; // 覆盖尾部
y -= p[i].my;
drawOffScreen.setColor(color);
drawOffScreen.fillOval(x, y, SIZE, SIZE);
}
if (x > AppletWidth || y > AppletHeight) { // 流星飞出窗口,重置流星
p[i].reset();
}
}
repaint();
try {
Thread.sleep(SLEEP);
} catch (InterruptedException e) {
}
}
}
}
class Meteor { // 流星类
int x, y; // 流星的位置
int mx, my; // 下落速度
Color color; // 流星颜色
Random r = new Random();
public Meteor() {
reset();
}
public void reset() {
int rand = (int) (Math.random() *100 ); //随机生成流星出现位置
if (rand >35 ) {
x = (int) (Math.random() *600 );
y = 0;
} else {
y = (int) (Math.random() * 150);
x =0 ;
}
mx = r.nextInt(2)+2; //随机生成下落速度和角度
my = 1;
color = new Color(
// 随机颜色
(new Double(Math.random() *128 )).intValue() +128 ,
(new Double(Math.random() *128 )).intValue() +128 ,
(new Double(Math.random() * 128)).intValue() + 128);
}
}
}
代码来源:顿开教育
这里的Player类需要自己导包,包我放在这个链接里了:
链接:https://pan.baidu.com/s/1zg4gqz69qptiVoRRN7dFWQ
提取码:a0rg
导包过程中可能有些人会出现这种问题:

实际应该是可以打开的:

如何导包:
先要将包复制粘贴到项目包下
然后进入:File –> Project Structure

然后依次点击Libraries、+号、Java

找到你要导的文件的位置,然后一直点OK就行了。
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注