📄 textpanel.java
字号:
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.sound.midi.*;
//该线程用于绘制艺术字
public class TextPanel extends JPanel implements Runnable
{
/**线程runner: 控制动画艺术字
* 线程runner1: 监控何时启动线程runner2
* 线程runner2: 显示动画结束语"GOOD BYE,EVERYONE"
* 线程runner3: 用于播放背景音乐
*/
private Thread runner, runner1, runner2, runner3;
private Sequence currentSound; //音序
private Sequencer player; //音序器
private String banner; //存储字符串: "W E L C O M E , E V E R Y O N E !"
private char bannerChars[]; //将字符串以字符数组的形式存储
private File file; //音乐文件对象
private String str1; //存储字符串: "GOOD BYE,EVERYONE!"
private FontMetrics re; //字体规格
private final int REGULAR_WD = 15;
private final int REGULAR_HT = 36;
private Font regularFont; //常规字体
private int temp=650;
public TextPanel()
{
super();
setBackground(Color.cyan);
try
{
//获取音乐文件,音序. 设置音序器的音序
file = new File("source/betsy.mid");
currentSound = MidiSystem.getSequence(file);
player = MidiSystem.getSequencer();
player.open();
player.setSequence(currentSound);
}catch(Exception e){}
banner="W E L C O M E , E V E R Y O N E !";
str1="GOOD BYE,EVERYONE!";
//创建字体对象
regularFont= new Font("TimesRoman", Font.BOLD, REGULAR_HT);
//获取字体规格
re=getFontMetrics(regularFont);
int bannerLength = banner.length();
StringBuffer bc = new StringBuffer(bannerLength);
int wd = 0;
for (int i = 0; i < bannerLength; i++)
{
char c = banner.charAt(i);
bc.append(c);
wd += REGULAR_WD;
}
bannerLength = bc.length();
bannerChars = new char[bannerLength];
bc.getChars(0, bannerLength, bannerChars, 0);
resize(wd + 10, 50);
//绘制艺术字
if(runner==null)
{
runner=new Thread(this);
runner.start();
}
//播放音乐
if(runner3==null)
{
runner3=new Thread(this);
runner3.start();
}
//监控何时启动线程runner2
if(runner1==null)
{
runner1=new Thread(this);
runner1.start();
}
}
//主控函数
public void run()
{
//绘制艺术字,艺术字从右到左循环移动
while(Thread.currentThread()==runner)
{
temp-=4;
if(temp<-450) temp=600;
repaint();
pause(100);
}
//当定时器(124秒)超时时,结束监控线程,启动线程runner2显示结束语: "GOOD BYE,EVERYONE!"
while(Thread.currentThread()==runner1)
{
pause(124000);
runner=null;
runner1=null;
runner2=new Thread(this);
runner2.start();
}
//绘制结束语: "GOOD BYE,EVERYONE
while(Thread.currentThread()==runner2)
{
repaint();
pause(100);
}
//播放音乐,显示结束语之后10秒内继续播放音乐
while(Thread.currentThread()==runner3)
{
try
{
player.start();
}catch(Exception e){ }
if(runner2!=null)
{
pause(10000);
player.close();
runner3=null;
}
}
}
//绘图函数
public void paintComponent(Graphics comp)
{
Graphics2D comp2D = (Graphics2D)comp;
//清除画板
comp2D.setColor(getBackground());
comp2D.fillRect(0,0,getSize().width,getSize().height);
//设置颜色和字体
comp2D.setColor(Color.black);
comp2D.setFont(regularFont);
//获取字符个数
int length = bannerChars.length;
//绘制艺术字: "W E L C O M E , E V E R Y O N E !"
if(runner!=null) {
for (int i = 0, x = temp; i < length; i++)
{
int px = (int) (10*Math.random()+ x);
int py = (int) (10*Math.random()+ REGULAR_HT);
comp2D.drawChars(bannerChars, i, 1, px, py);
x += REGULAR_WD;
}
}
//在画板中间绘制结束语: "GOOD BYE,EVERYONE!"
if(runner2!=null)
{
int x=(getSize().width-re.stringWidth(str1))/2;
int y=(getSize().height)/2;
comp2D.drawString(str1,x,y);
}
}
//该方法用于设置线程式的休眠时间
public void pause(int seconds)
{
try
{
Thread.sleep(seconds);
}catch(InterruptedException e) {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -