Java图形用户界面设计音乐播放器
设计思路
音乐播放器的基础是可以播放音乐,所以要有一个实现播放音乐功能的类audioplay,图形界面就是通过动作调用audioplay里面的函数。关于实现播放器图形界面的步骤是,先设计好软件界面,再去添加监听器,实现播放,暂停,上一首,下一首,循环播放,导入音乐,播放音乐等功能。我参考的是QQ音乐的软件界面,实现音乐播放的基本功能,并添加新功能。
实现界面:
实现步骤
- 设计一个完整的播放器界面,并添加按钮响应
播放器界面的背景用的是QQ音乐的背景
需要的控件有
为了方便设计,不断测试得到界面的参数
在init()函数中通过不断调整位置设计图形基本界面
添加按钮响应主要重写两个接口:
- 第一个接口 actionPerform()即动作触发接口实现按钮相应的:
- 打开音乐文件
- 播放该音乐
- 点击播放音乐
- 是否显示音乐列表
- 播放下一首
- 播放上一首
- 设置播放方式(0->循环播放 1->顺序播放 2->随机播放)
- 第二个接口是mouseClicked鼠标点击触发事件实现点击音乐播放列表两次播放音乐。
文件框架采用音乐,图片分开放置。
- 实现歌词根据歌曲内容逐句提醒
实现该功能的基本思路是扫描一遍歌词,如果当前时间是在该歌词的播放时间,则该歌词为当前歌词,设置当前歌词高亮。对于时间段的控制,我用一个数组存储断点时间。
Breaktime存储每句歌词的开始时间,结束时间为下一句歌词的开始时间-1,通过循环遍历整个歌词,并高亮加粗当前歌词。对于越界处理,即歌词太长,歌词框显示不完,我采用的是判断当前是否越界,越界多少行,前面多少行就不显示。
- 实现进度条根据歌曲播放时间移动
由于我的软件界面大小和QQ音乐一个大小,所以我的进度条的图片采用的是QQ音乐播放完的进度条截屏。
位置在起点为(0,height-77)宽度为width高度为3。需要根据音乐的时长和当前播放时间更新它的长度。
长度为已播放时间占总时间的比例乘以进度条长度。 - 导入一个gif动画图片
模仿QQ音乐的方式,左边显示的是图片,所以gif我添加的是下面的波形效果,用GIF录制软件,录制了一段波形图,放在了进度条上面。
同样,左边的音乐播放图片是随机切换的。我在时间计数器里设置10s参数一个1-10的随机数,对应的是10张图片,选中一个图片更换原来图片。
- 歌曲列表右侧添加歌曲时间的列
导入音乐的时候,计算出播放的时间,并在时间列表添加该值。
音乐播放时间的控件位置
导入歌曲的方式是将音乐歌曲名存放在
每次添加音乐时,会检查有没有该音乐,若没有则添加到列表,计算时间,有该音乐则不会添加。
时间的计算方式为
- 进度条附件添加一个当前播放时间的显示
当前时间的控件,它是一个动态显示的控件,在时间计数器中需要更新它。
计算时间:分钟为秒数/60,秒钟为秒数%60.
- 双击列表播放该歌曲
用JList存储歌曲并添加监听器
当点击两次后,触发音乐列表动作
首先,检查播放列表是否有音乐,vt为存放歌曲的向量,如果不为空则有歌曲,否则没有,如果选中了则设置播放路径为选中的路径,如果没有选中则选中第一个,然后再播放音乐。
-
播放暂停
当播放的时候按下暂停键会停止播放,图标会转换为播放键。
-
播放方式
分别代表随机,循环,顺序播放
按下按键会转换图标,并切换播放方式。
当播放歌曲播放结束后,会根据播放方式标志flagway来决定播放方式。循环播放为重新播放该歌曲,顺序播放,获得该歌曲的位置后,通过循环队列获得下一个歌曲的歌名并播放。随机播放通过随机函数选中一个不同的音乐。
3. 歌曲上一首下一首功能
先获得当前播放歌曲的位置,通过循环队列的方式,获得上一个下一个歌曲的歌曲名,并播放。
源代码:
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.*;
import javax.swing.text.*;
import javax.swing.text.StyleContext.NamedStyle;
import javax.swing.*;
import static javax.swing.JFrame.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import java.util.Timer;
/*
音乐播放器类
*/
class audioplay{
AudioClip adc;
URL url;
boolean adcFlag=false;//文件标志
boolean playFlag=false;//播放标志
void SetPlayAudioPath(String path){//设置路径
try{
url = new URL(path);
if(adcFlag==true){adc.stop();playFlag=false;}
adc = Applet.newAudioClip(url);
adcFlag=true;
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
}
void play(){ //播放音乐
adc.play();
playFlag=true;
}
void stop(){ //暂停音乐
adc.stop();
playFlag=false;
}
}
/*
图像界面类
*/
class MyExtendsJFrame extends JFrame implements ActionListener,MouseListener{
//参数
final int width = 1280;//界面宽度1280
final int height = 836;//界面高度836
final int tool_width = 42;//图标大小
//工作成员
audioplay audioPlay;//音乐播放器
Timer nTimer;//定时器
String MusicName;//音乐名
String playFile;//文件路径
String playFileName;//文件名
String playFileDirectory;//文件的具体目录
int MusicTime;//当前时间
Vector vt = new Vector();//播放队列
Vector vtime = new Vector();//时间队列
int flagway = 0;//播放方式 0->循环播放 1->顺序播放 2->随机播放
//控件
JLabel background;//背景
JButton buttonPlay;//播放按钮
JButton buttonOpenFile;//打开文件按钮
JTextPane textLyrics;//歌词
JLabel playTime;//进度条
JList listPlayFile;//播放列表
JButton buttonNext;//下一首
JButton buttonPre;//上一首
JLabel backgroundPlay;//播放图片
JTextArea textMusic;//音乐名
JList listPlayFileTime;//音乐播放时间
JButton buttonShowList;//播放列表
JTextArea musictitle;//歌曲名
JButton buttonWay;//播放方式
JTextArea TimeCount;//显示当前播放时间
JLabel gifwave;//动态波形
JLabel giflight;//动态荧光棒
/*
歌词
*/
//飘洋过海
String[] sLyrics1 = {//{4,7,10,12,16,22,26,29,31,35,39,42,48,52}
"记忆它总是慢慢的累积\n",//4
"在我心中无法抹去\n",//7
"为了你的承诺\n", //10
"我在最绝望的时候\n",//12
"都忍着不哭泣\n",//16
"陌生的城市啊\n",//22
"熟悉的角落里\n",//26
"也曾彼此安慰\n",//29
"也曾相拥叹息\n",//31
"不管将会面对什么样的结局\n",//35
"在漫天风沙里望着你远去\n",//39
"我竟悲伤得不能自己\n",//42
"多盼能送君千里\n",//45
"直到山穷水尽\n",//48
"一生和你相依"//52
};
//山外小楼夜听雨
String[] sLyrics2 = {
"芙蓉花又栖满了枝头 \n",
"亲何蝶雅留\n",
"票白如江水向东流入\n" ,
"望断门前隔岸的杨柳 \n",
"寂寞仍不休\n",
"我无言让眼泪长流\n",
"我独酌山外小阁楼\n",
"听一夜相思愁\n",
"醉后让人烦忧心事雅收\n",
"山外小阁楼我乘一叶小舟\n",
"放思念随风漂流\n",
"我独坐山外小阁楼\n" ,
"窗外渔火如豆\n",
"江畔晚风拂柳诉尽离愁\n",
"当月色暖小楼是谁又在弹奏\n",
"那一曲思念常留\n"
};
//我和我的祖国
String[] sLyrics3 = {//{1,6,10,15,19,24,28,32,50,59}
"我和我的祖国\n",
"一刻也不能分割\n",
"无论我走到哪里\n",
"都流出一首赞歌\n",
"我歌唱每一座高山\n",
"我歌唱每一条河\n",
"袅袅炊烟,小小村落\n",
"路上一道辙\n",
"你用你那母亲的脉搏和我诉说\n"
};
/*
初始化界面
*/
public MyExtendsJFrame(){
audioPlay=new audioplay(); //音乐播放对象
setTitle("星星播放器");
setBounds(160,100,1300,880);
//setBounds(160,100,1300,880);
setLayout(null);//排版方式
init(); //初始化
setVisible(true);//设置界面可见
setDefaultCloseOperation(EXIT_ON_CLOSE);//默认退出方式
}
void init(){//界面的初始化
/*
界面背景设置
*/
Icon img=new ImageIcon(".//Imag//background.jpg");//界面背景
background = new JLabel(img);
background.setBounds(0,0,width,height);//设置位置
getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));//设为最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
/*
播放按钮设置
*/
buttonPlay=new JButton();//播放按钮
buttonPlay.setBounds(width/2-tool_width/2,height-tool_width - 10,tool_width,tool_width); //设置位置
Icon icon=new ImageIcon(".//Imag//play.jpg");//设置图标
buttonPlay.setIcon(icon);
buttonPlay.setBorderPainted(false);//消隐
buttonPlay.addActionListener(this);//添加监听器
add(buttonPlay);
/*
下一首按钮
*/
buttonNext = new JButton("");//下一首按钮
buttonNext.setBounds(width/2-tool_width/2+47, height-tool_width - 10, tool_width, tool_width);
icon = new ImageIcon(".//Imag//next.jpg");
buttonNext.setIcon(icon);
buttonNext.setBorderPainted(false);//消隐
buttonNext.addActionListener(this);
add(buttonNext);
/*
上一首按钮
*/
buttonPre = new JButton("");
buttonPre.setBounds(width/2-tool_width/2-40, height-tool_width - 12, tool_width-3, tool_width-3);
icon = new ImageIcon(".//Imag//pre.jpg");
buttonPre.setIcon(icon);
buttonPre.setBorderPainted(false);//消隐
buttonPre.addActionListener(this);
add(buttonPre);
/*
播放方式按钮
*/
buttonWay = new JButton("");
buttonWay.setBounds(width/2-tool_width/2-90, height-tool_width - 10, tool_width-10, tool_width-10);
icon = new ImageIcon(".//Imag//loop.jpg");
buttonWay.setIcon(icon);
buttonWay.setBorderPainted(false);//消隐
buttonWay.addActionListener(this);
add(buttonWay);
/*
文件打开按钮
*/
buttonOpenFile=new JButton("");//打开按钮
buttonOpenFile.setBounds(width-95,height-50,tool_width-10,tool_width-10); //设置位置
icon=new ImageIcon(".//Imag//open.jpg"); //图标
buttonOpenFile.setIcon(icon);
buttonOpenFile.setBorderPainted(false);//消隐
buttonOpenFile.addActionListener(this);//添加监听器
add(buttonOpenFile);
/*
音乐播放背景
*/
icon = new ImageIcon(".//Imag//1.jpg");
backgroundPlay = new JLabel(icon);
backgroundPlay.setBounds(100, 120, 450, 450);
getLayeredPane().add(backgroundPlay);
//backgroundPlay.addMouseListener(this);//添加监听器
/*
动态的GIF波形
*/
icon = new ImageIcon(".//Imag//wave.gif");
gifwave = new JLabel(icon);
gifwave.setBounds(-10,height-133,width-20,50); //设置大小
add(gifwave);
gifwave.setVisible(true);
/*
时间条
*/
icon=new ImageIcon(".//Imag//time.jpg"); //时间条
playTime = new JLabel(icon);
playTime.setBounds(0,height-77,width,3); //设置大小
add(playTime);
/*
设置时间显示
*/
TimeCount = new JTextArea("00:00");
TimeCount.setBounds(width/2-350,height-45,80,20);
TimeCount.setForeground(Color.white);
TimeCount.setFont(new Font("楷体",1,20));
TimeCount.setOpaque(false);
add(TimeCount);//添加时间计数监听器
/*
音乐列表按钮
*/
buttonShowList = new JButton("");
buttonShowList.setBounds(width-60,height-50,tool_width-10,tool_width-10);
buttonShowList.setIcon(new ImageIcon(".//Imag//list.jpg"));
buttonShowList.setBorderPainted(false);//消隐
buttonShowList.addActionListener(this);
add(buttonShowList);
/*
歌词
*/
textLyrics=new JTextPane(); //歌词
textLyrics.setBounds(width/2+300,height/2-200,250,300);//设置位置
textLyrics.setForeground(Color.white);//前置颜色
textLyrics.setOpaque(false);
add(textLyrics);
textLyrics.setText("这是歌词");//歌词内容
textLyrics.setFont(new Font("楷体",1,20));
/*
歌名
*/
musictitle = new JTextArea("歌名");
musictitle.setBounds(width/2+300,height/2-200-50,300,100);
musictitle.setForeground(Color.white);
musictitle.setOpaque(false);
musictitle.setFont(new Font("楷体",1,30));
add(musictitle);
/*
音乐列表
*/
listPlayFile=new JList(); //音乐列表
listPlayFile.setBounds(width-300,height-300,200,150); //设置位置
listPlayFile.setOpaque(false);
listPlayFile.setFont(new Font("楷体",1,20));
listPlayFile.setBackground(new Color(0, 0, 0, 0));//设置背景
listPlayFile.setForeground(Color.white);
add(listPlayFile);
listPlayFile.addMouseListener(this);//添加监听器
/*
音乐播放时间
*/
listPlayFileTime = new JList();
listPlayFileTime.setBounds(width-300+200,height-300,150,150);
listPlayFileTime.setOpaque(false);
listPlayFileTime.setFont(new Font("楷体",1,20));
listPlayFileTime.setBackground(new Color(0, 0, 0, 0));
listPlayFileTime.setForeground(Color.white);
add(listPlayFileTime);
}
/*
时间计数器
*/
public void timerFun(int musicTime)
{
MusicTime = musicTime;//当前音乐播放需要的时间
if (nTimer != null) {//计数器如果在走则停下来
nTimer.cancel();
}
//重新创建一个时间对象
nTimer = new Timer();
nTimer.schedule(new TimerTask()//内部类
{
int PlayTime = 0;
public void run()//时间走
{
PlayTime ++;//+1s
if (PlayTime >= MusicTime) {//播放结束
nTimer.cancel();
//int flagway = 0;//播放方式 0->循环播放 1->顺序播放 2->随机播放
if(flagway==0&&vt.size()!=0){//0->循环播放
audioPlay.play();
timerFun(MusicTime);
}
else if(flagway==1&&vt.size()!=0){//1->顺序播放
int position = vt.lastIndexOf(playFileName);
position = (position+1)%(vt.size());//通过取余获得下一个音乐的位置
playFileName=(String)vt.get(position);
playFile = playFileDirectory + playFileName;
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.play();//播放下一首音乐
File file = new File(playFile);
int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
timerFun(nMusicTime);
}
else if(flagway==2){
int position = vt.lastIndexOf(playFileName);
int choose = 0;
do{//随机选中一个不同的音乐
choose = (int)(Math.random() * vt.size());
}while(position==choose);
playFileName=(String)vt.get(choose);
playFile = playFileDirectory + playFileName;
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.play();//播放下一首音乐
File file = new File(playFile);
int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
timerFun(nMusicTime);
}
}
/*
更换音乐播放图片(随机)
*/
final int N = 10;//10张背景图
if(PlayTime%6==0){
int choose = (int)(Math.random()*N)+1;
Icon picture = new ImageIcon(".//Imag//"+choose+".jpg");
backgroundPlay.setIcon(picture);
System.out.println("选择图片"+choose);
}
/*
显示当前播放时间
*/
int Second = PlayTime % 60;//秒
int Minute = PlayTime / 60;//分钟
String sSecond = "";//秒钟字符串
String sMinute = "";//分钟字符串
if (Second < 10) {//低于2位添加0
sSecond = "0" + Second;
}
else{
sSecond = "" + Second;
}
if (Minute < 10) {//低于2位添加0
sMinute = "0" + Minute;
}
else{
sMinute = "" + Minute;
}
String sPlayTime = sMinute + ":" + sSecond;
System.out.println(sPlayTime);
TimeCount.setText(sPlayTime);//更新当前播放时间
playTime.setBounds(50,height-77, width * PlayTime / MusicTime , 3);
/*
歌词显示
*/
textLyrics.setText("");//歌词清空
//确定是哪个台词
//1->飘洋过海 2->山外小楼夜听雨 3->我和我的祖国
int flag = 0;
if(playFileName.equals("飘洋过海.wav")){
flag = 1;
System.out.println("播放飘洋过海歌词");
}
else if(playFileName.equals("山外小楼夜听雨.wav")){
flag = 2;
System.out.println("播放山外小楼夜听雨歌词");
}
else if(playFileName.equals("我和我的祖国.wav")){
flag = 3;
System.out.println("播放我和我的祖国歌词");
}
//逐行扫描歌曲,对应时间段的歌词高亮
if(flag == 1){//飘洋过海
int []breaktime = {1,5,8,11,13,17,23,27,30,32,36,40,43,45,49,53};
final int MAX = 12;//最多显示12行
//确定时间段
int position = 0;
for (int i = 0; i < sLyrics1.length; i++)
{
for(position = 0;position <sLyrics1.length-1 ;position++){
if(PlayTime<breaktime[0]){
break;
}
if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
break;
}
}
System.out.println("当前播放位置"+position);
SimpleAttributeSet attrSet = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrSet, "隶书");
StyleConstants.setFontSize(attrSet,20);
int over = position-MAX;//越过的歌词
System.out.println("越界"+over);
try
{
Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
StyleConstants.setBold(attrSet, true);//加粗
if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
doc.insertString(doc.getLength(), sLyrics1[i], attrSet);//当前歌词高亮
System.out.println(sLyrics1[i]);
}
else{//不在当前歌词普通显示
StyleConstants.setForeground(attrSet, Color.white);
StyleConstants.setBold(attrSet, false);
if(over>=0&&i-over<=0){//越界
continue;
}
doc.insertString(doc.getLength(), sLyrics1[i], attrSet);
}
}
catch (BadLocationException localBadLocationException) {}
}
}
else if(flag == 2){//山外小楼夜听雨
//设置断点
int []breaktime = {17,21,25,30,35,39,44,49,53,59,66,72,76,81,87,94,100};
final int MAX = 12;//最多显示12行
//确定时间段
int position = 0;
for (int i = 0; i < sLyrics2.length; i++)
{
for(position = 0;position <sLyrics2.length-1 ;position++){
if(PlayTime<breaktime[0]){
break;
}
if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
break;
}
}
System.out.println("当前播放位置"+position);
SimpleAttributeSet attrSet = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrSet, "隶书");
StyleConstants.setFontSize(attrSet,20);
int over = position-MAX;//越过的歌词
System.out.println("越界"+over);
try
{
Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
StyleConstants.setBold(attrSet, true);//加粗
if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
doc.insertString(doc.getLength(), sLyrics2[i], attrSet);//当前歌词高亮
System.out.println(sLyrics2[i]);
}
else{//不在当前歌词普通显示
StyleConstants.setForeground(attrSet, Color.white);
StyleConstants.setBold(attrSet, false);
if(over>=0&&i-over<=0){//越界
continue;
}
doc.insertString(doc.getLength(), sLyrics2[i], attrSet);
}
}
catch (BadLocationException localBadLocationException) {}
}
}
else if(flag == 3){//我和我的祖国
int []breaktime = {1,6,10,15,19,24,28,32,50,59};
final int MAX = 12;//最多显示12行
//确定时间段
int position = 0;
for (int i = 0; i < sLyrics3.length; i++)
{
for(position = 0;position <sLyrics3.length-1 ;position++){
if(PlayTime<breaktime[0]){
break;
}
if(PlayTime>=breaktime[position]&&PlayTime<=breaktime[position+1]-1){
break;
}
}
System.out.println("当前播放位置"+position);
SimpleAttributeSet attrSet = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrSet, "隶书");
StyleConstants.setFontSize(attrSet,20);
int over = position-MAX;//越过的歌词
System.out.println("越界"+over);
try
{
Document doc = MyExtendsJFrame.this.textLyrics.getDocument();//获得歌词内容
StyleConstants.setForeground(attrSet, Color.yellow);//当前歌词高亮
StyleConstants.setBold(attrSet, true);//加粗
if(PlayTime>=breaktime[i]&&PlayTime<=breaktime[i+1]-1){
doc.insertString(doc.getLength(), sLyrics3[i], attrSet);//当前歌词高亮
System.out.println(sLyrics3[i]);
}
else{//不在当前歌词普通显示
StyleConstants.setForeground(attrSet, Color.white);
StyleConstants.setBold(attrSet, false);
if(over>=0&&i-over<=0){//越界
continue;
}
doc.insertString(doc.getLength(), sLyrics3[i], attrSet);
}
}
catch (BadLocationException localBadLocationException) {}
}
}
}
}, 0L, 1000L);
}
/*
重写监听器
*/
@SuppressWarnings("unchecked")//忽略警告
/*
鼠标按下动作
*/
public void actionPerformed(ActionEvent e){
/*
打开音乐文件
*/
if (e.getSource() == buttonOpenFile)
{
FileDialog openFile = new FileDialog(this, "音乐文件夹");//文件夹窗体
openFile.setVisible(true);//设为可见
if(openFile.getFile()!=null){//有选中的
playFileName = openFile.getFile();//获得选中的文件名(我和我的祖国.wav)
}
else{//没有选中的,直接退出
return;
}
System.out.println(playFileName);
this.playFileDirectory = openFile.getDirectory();//文件的具体目录C:\Users\LittleStar\Desktop\音乐播发器\Music\
System.out.println(playFileDirectory);
playFile = playFileDirectory + playFileName;//目录+文件名=指定文件
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.stop();//暂停当前播放
//播放需要的时间
File file = new File(playFile);
int iMusicTime = (int)file.length() / 1024 / 173;
int iSecond = iMusicTime % 60;
int iMinute = iMusicTime / 60;
if(!vt.contains(playFileName)){//如果该音乐不在目录
vt.add(playFileName);
System.out.println("添加音乐"+playFileName);
listPlayFile.setListData(vt);//将播放列表更新
vtime.add(iMinute + ":" + iSecond);
listPlayFileTime.setListData(vtime);
}
/*
播放该音乐
*/
audioPlay.SetPlayAudioPath("file:" + this.playFile);
audioPlay.play();
musictitle.setText(this.playFileName);
Icon icon = new ImageIcon(".//Imag//stop.jpg");//将按钮改为暂停
buttonPlay.setIcon(icon);
backgroundPlay.setVisible(true);
int nMusicTime = (int)file.length() / 1024 / 173;//计算播放时间
timerFun(nMusicTime);//启动时间
}
/*
点击播放音乐
*/
if (e.getSource() == buttonPlay) {
if (!audioPlay.playFlag)//如果当前没有播放
{
if(vt.size()!=0){//播放播放队列不为空
if(listPlayFile.getSelectedValue() != null){//如果列表音乐有选中的
playFile = playFileDirectory + listPlayFile.getSelectedValue().toString();//设置播放音乐为选中的音乐
}
else{//没有选中的
playFile = playFileDirectory + listPlayFile.getModel().getElementAt(0).toString();//选中第一首音乐
listPlayFile.setSelectedIndex(0);//第一首音乐选中
}
audioPlay.stop();//关闭之前的
audioPlay.SetPlayAudioPath("file:" + playFile);//设置当前播放路径
audioPlay.play();//播放
Icon icon = new ImageIcon(".//Imag//stop.jpg");
buttonPlay.setIcon(icon);
backgroundPlay.setVisible(true);
File file = new File(this.playFile);
int nMusicTime = (int)file.length() / 1024 / 173;
timerFun(nMusicTime);
}
else{//当前播放队列为空
System.out.println("没有音乐可以播放");
}
}
else//当前为音乐播放状态转为暂停
{
audioPlay.stop();
nTimer.cancel();
Icon icon = new ImageIcon(".//Imag//play.jpg");
this.buttonPlay.setIcon(icon);
this.backgroundPlay.setVisible(false);
//this.nTimer.cancel();
}
}
/*
是否显示音乐列表
*/
if(e.getSource() == buttonShowList){
System.out.println("是否显示音乐列表");
if (listPlayFile.isVisible())
{
System.out.println("关闭音乐列表");
listPlayFile.setVisible(false);
listPlayFileTime.setVisible(false);
}
else
{
System.out.println("显示音乐列表");
listPlayFile.setVisible(true);
listPlayFileTime.setVisible(true);
}
}
/*
播放下一首
*/
if(e.getSource() == buttonNext){
if(vt.size()!=0){
//寻找当前播放的位置
int position = vt.lastIndexOf(playFileName);
//System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
position = (position+1)%(vt.size());//通过取余获得下一个音乐的位置
//System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
//System.out.println(vt.get(position));
playFileName=(String)vt.get(position);
playFile = playFileDirectory + playFileName;
musictitle.setText(playFileName);
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.play();//播放下一首音乐
File file = new File(playFile);
int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
timerFun(nMusicTime);
}
else{
System.out.println("没有音乐可以播放");
}
}
/*
播放上一首
*/
if(e.getSource() == buttonPre){
if(vt.size()!=0){
//寻找当前播放的位置
int position = vt.lastIndexOf(playFileName);
position = (vt.size()+position-1)%(vt.size());//通过取余获得下一个音乐的位置
System.out.println("当前位置"+position+"当前音乐数量"+vt.size());
System.out.println(vt.get(position));
playFileName=(String)vt.get(position);
playFile = playFileDirectory + playFileName;
musictitle.setText(playFileName);
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.play();//播放下一首音乐
File file = new File(playFile);
int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
timerFun(nMusicTime);
}
else{
System.out.println("没有音乐可以播放");
}
}
/*
设置播放方式
*/
if(e.getSource()==buttonWay){
//0->循环播放 1->顺序播放 2->随机播放
if(flagway==0){//循环播放切换到顺序播放
flagway = 1;
System.out.println("顺序播放");
Icon icon = new ImageIcon(".//Imag//unloop.jpg");
buttonWay.setIcon(icon);
}
else if(flagway == 1){//顺序播放切换到随机播放
flagway = 2;
System.out.println("随机播放");
Icon icon = new ImageIcon(".//Imag//rand.jpg");
buttonWay.setIcon(icon);
}
else if(flagway == 2){//随机播放切换到循环播放
flagway = 0;
System.out.println("循环播放");
Icon icon = new ImageIcon(".//Imag//loop.jpg");
buttonWay.setIcon(icon);
}
}
}
//鼠标点击触发事件
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2) {
/*
点击音乐播放列表两次
*/
if(e.getSource()==listPlayFile){
int n =vt.size();//播放列表的音乐数
if (n != 0)//如果有音乐
{
if (listPlayFile.getSelectedValue() != null) {//选中了一个音乐
playFileName = listPlayFile.getSelectedValue().toString();
playFile = playFileDirectory + playFileName;//播放文件设为选中的文件
}
else {//未选中则选中第一个
playFileName = listPlayFile.getModel().getElementAt(0).toString();
playFile = playFileDirectory + playFileName;
}
audioPlay.SetPlayAudioPath("file:" + playFile);//设置播放路径
audioPlay.play();//播放
musictitle.setText(listPlayFile.getSelectedValue().toString());//设置音乐名
Icon icon = new ImageIcon(".//Imag//stop.jpg");//播放按钮转换为暂停
buttonPlay.setIcon(icon);
backgroundPlay.setVisible(true);
File file = new File(playFile);
int nMusicTime = (int)file.length() / 1024 / 173;//文件播放需要的时间
timerFun(nMusicTime);
}
}
}
}
//用不到的接口
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
public class MusicPlay{
public static void main(String[] args) {
MyExtendsJFrame frame=new MyExtendsJFrame();
}
}
仅供参考
源代码及文件