制作简易音乐播放器:
显示效果:
全部代码:
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.util.Timer;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class music{ //定义歌曲结构体
public String musicPath; //歌曲路径
public String musicName; //歌曲名
public int musicTime; //歌曲时间
}
class MobileTool { //界面相应鼠标移动
private Point OriginalPoint=null,MobileDistance=null; //鼠标移动前的位置和鼠标移动的距离
private boolean isDraging = false; //用与判断鼠标书否松开
public MobileTool(final Component frame){
super();
OriginalPoint=new Point(); //鼠标移动前的位置
MobileDistance=new Point(); //鼠标移动的距离
/*确保取消标题栏以后,窗口仍然能接受鼠标点击事件*/
frame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) { //按下鼠标时触发的动作
isDraging = true;
OriginalPoint.x = e.getX(); //获取鼠标移动前的位置
OriginalPoint.y = e.getY();
}
public void mouseReleased(MouseEvent e) { //松开鼠标触发的事件
isDraging = false;
}
});
frame.addMouseMotionListener(new MouseMotionAdapter() { //鼠标移动时的动作
public void mouseDragged(MouseEvent e) {
if (isDraging) {
MobileDistance= frame.getLocation(); //获取鼠标移动距离
/*重新绘制位置*/
frame.setLocation(MobileDistance.x + e.getX() - OriginalPoint.x, MobileDistance.y + e.getY() - OriginalPoint.y);
}
}
});
}
}
class audioplay{//播放音乐类
AudioClip adc;// 声音音频剪辑对象
URL url;
boolean adcFlag=false;
boolean playFlag=false;
void SetPlayAudioPath(String path){
try{
url = new URL(path);
// System.out.println(adc.toString());
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{
private static final long serialVersionUID = 1L;
private static final int Font_PLAIN = 0;
private static final String regex="\\[\\d{2}:\\d{2}\\.\\d{2}\\]";
private static final String regex1="\\[\\d{2}:\\d{2}\\.\\d{2}\\]";
//窗口类
LinkedList<music> Music=new LinkedList<music>();//创建歌曲结构体为对象的链表
audioplay audioPlay=new audioplay(); //创建播放对象
String playName,playDirectory,playPath,lyricsPath; //文件名,文件路径,音乐文件本身,单词文件本身
int TIME; //歌曲时间备用
int schemaflag=0; //歌曲播放模式(1单曲循环,0列表循环,2随机播放)
music m; //备用歌曲对象
JLabel background;//背景控件
JLabel cartoon;//播放动画
JButton buttonPlay,buttonStop,buttonPrev,buttonNext;
JButton buttonloop; //点击后循环播放
JButton buttonunloop; //点击后随机播放
JButton buttonrandom; //点击后列表循环
JButton buttonlist; //点击后循环播放
JButton buttonOpen,buttonList1,buttonList2,buttonexit,buttonmin;
JTextPane textLyrics1,textLyrics2,textLyrics3;//歌词控件
JTextPane time;
JLabel playTime;//播放进度条控件
JList listPlayFile;//播放列表控件
Timer nTimer;//定时器对象
Vector vt=new Vector (); //创建Vector对象,通过add方法添加多行
String lyc[]=new String[100]; //存放歌词信息
int time0[]=new int[100]; //存放歌词对应的时间
String time1[]=new String[100];
public MyExtendsJFrame(){
setBounds(321,121,1277,795); //设置窗口大小
setLayout(null);//空布局
init(); //添加控件的操作封装成一个函数
setVisible(true);//放在添加组件后面执行
setDefaultCloseOperation(EXIT_ON_CLOSE);
dispose(); //去掉标题栏
setUndecorated(true);
setVisible(true);
}
public void play_init(String x,String y){
audioPlay.SetPlayAudioPath("file:"+y);//设置播放文件
audioPlay.play();//开始播放
timerFun();
remove(textLyrics1);
remove(textLyrics2);
remove(textLyrics3);
m=new music(); //创建歌曲对象
int j=y.indexOf(".");
StringBuilder term=new StringBuilder(y);
term.replace(j+1,j+4,"txt");
lyricsPath=new String(term);
String lyric1=""; //存放歌词的字符串形式
String t=""; //用来保存字符串
try {
File filename=new File(lyricsPath);
InputStreamReader reader=new InputStreamReader(new FileInputStream(filename));//建立输入流对象
BufferedReader buff=new BufferedReader(reader);
while((t=buff.readLine())!=null){
lyric1=lyric1+t+buff.readLine();
}
buff.close();
}catch(Exception e1){
e1.printStackTrace();
}
String lyric=lyric1.substring(10); //方便计算
lyc=lyric.split(regex);
//歌词取为歌词数组
String text=new String();
for(int i=0;i<lyc.length;i++){
lyc[i]=lyc[i]+"\n";
text+=lyc[i];
}
//获取对应的时间
Pattern p=Pattern.compile(regex1);
Matcher m0=p.matcher(lyric1);
int a=0;
while(m0.find()){
time1[a]=m0.group();
a++;
}
for (int i=0;i<time0.length;i++){
time0[i]=0;
}
try{
int i;
for (i=0;i<time1.length;i++){
if(time1[i]!=""){
String a1=time1[i].substring(1, 3);
if(a1.equals("00")){
time0[i]=Integer.parseInt(time1[i].substring(4,6));
}
else{
time0[i]=60+Integer.parseInt(time1[i].substring(4,6));
}
}
}
}catch(Exception e1){
e1.printStackTrace();
}
m.musicPath=y;
m.musicName=x;
TIME=(int)(new File(y)).length()/1024/173;
m.musicTime=TIME;
listPlayFile.setListData(vt);//把Vector对象添加到播放列表控件中
textLyrics1=new JTextPane();
textLyrics1.setBounds(1020,100,250,250);
textLyrics1.setForeground(Color.red);
Font f=new Font("隶书",Font_PLAIN,20);
textLyrics1.setFont(f);
textLyrics1.setOpaque(false);
add(textLyrics1);
textLyrics2=new JTextPane();
textLyrics2.setBounds(1010,350,250,36);
textLyrics2.setForeground(Color.BLUE);
f=new Font("隶书",Font_PLAIN,22);
textLyrics2.setFont(f);
textLyrics2.setOpaque(false);
add(textLyrics2);
textLyrics3=new JTextPane();
textLyrics3.setBounds(1020,390,250,258);
textLyrics3.setForeground(Color.red);
f=new Font("隶书",Font.PLAIN,20);
textLyrics3.setFont(f);
textLyrics3.setOpaque(false);
add(textLyrics3);
textLyrics3.setText(text);
remove(buttonPlay);
buttonStop=new JButton();
buttonStop.setBorderPainted(false);
buttonStop.setBounds(90,687,43,44);
Icon icon=new ImageIcon(".//Stop.jpg");
buttonStop.setIcon(icon);
add(buttonStop);
buttonStop.addActionListener(this);
validate();
repaint();
}
public void actionPerformed(ActionEvent e){ //按钮事件
if(e.getSource()==buttonPlay){//播放按钮事件
audioPlay.SetPlayAudioPath(playPath);//设置播放文件
audioPlay.play();//开始播放
timerFun();
remove(buttonPlay);
buttonStop=new JButton();
buttonStop.setBorderPainted(false);
buttonStop.setBounds(90,687,43,44);
Icon icon=new ImageIcon(".//Stop.jpg");
buttonStop.setIcon(icon);
add(buttonStop);
buttonStop.addActionListener(this);
validate(); //减轻延迟效果
repaint();
}
else if(e.getSource()==buttonStop){//停止按钮事件
audioPlay.stop();//停止播放
nTimer.cancel();
remove(buttonStop);
buttonPlay=new JButton();
buttonPlay.setBorderPainted(false);
buttonPlay.setBounds(90,687,43,45);
Icon icon=new ImageIcon(".//Play.jpg");
buttonPlay.setIcon(icon);
add(buttonPlay);
buttonPlay.addActionListener(this);
validate();
repaint();
}
else if(e.getSource()==buttonOpen){//打开文件按钮事件
if(nTimer!=null){nTimer.cancel();}
FileDialog openFile=new FileDialog(this,"打开文件");
openFile.setVisible(true);
playName=openFile.getFile();
playDirectory=openFile.getDirectory();
playPath=playDirectory+playName;
play_init(playName,playPath);
Music.add(m);
vt.add(m.musicName+" 1:"+(m.musicTime-60));
}
else if(e.getSource()==buttonlist){//循环按钮事件
schemaflag=1;
remove(buttonlist);
buttonloop=new JButton();
buttonloop.setBorderPainted(false);
buttonloop.setBounds(1070,699,30,26);
Icon icon=new ImageIcon(".//loop.jpg");
buttonloop.setIcon(icon);
add(buttonloop);
buttonloop.addActionListener(this);
validate();
repaint();
}
else if(e.getSource()==buttonloop){//随机播放事件
schemaflag=2;
remove(buttonloop);
buttonrandom=new JButton();
buttonrandom.setBorderPainted(false);
buttonrandom.setBounds(1070,699,30,26);
Icon icon=new ImageIcon(".//random.jpg");
buttonrandom.setIcon(icon);
add(buttonrandom);
buttonrandom.addActionListener(this);
validate();
repaint();
}
else if(e.getSource()==buttonrandom){//列表播放事件
schemaflag=0;
remove(buttonrandom);
buttonlist=new JButton();
buttonlist.setBorderPainted(false);
buttonlist.setBounds(1070,699,30,26);
Icon icon=new ImageIcon(".//listplay.jpg");
buttonlist.setIcon(icon);
add(buttonlist);
buttonlist.addActionListener(this);
validate();
repaint();
}
else if(e.getSource()==buttonPrev){//上一首按钮事件
int s=0;
for (int i=Music.size()-1;i>=0;i--){
if(Music.get(i).musicName.equals(playName)&&i==0){
break;
}
else if(Music.get(i).musicName.equals(playName)){
s=i-1;
break;
}
}
nTimer.cancel();
playPath=Music.get(s).musicPath;
playName=Music.get(s).musicName;
play_init(playName,playPath);
}
else if(e.getSource()==buttonNext){//下一首按钮事件
int s=0;
for (int i=Music.size()-1;i>=0;i--){
if(Music.get(i).musicName.equals(playName)&&i==Music.size()-1){
s=i;
break;
}
else if(Music.get(i).musicName.equals(playName)){
s=i+1;
break;
}
}
nTimer.cancel();
playPath=Music.get(s).musicPath;
playName=Music.get(s).musicName;
play_init(playName,playPath);
}
else if(e.getSource()==buttonList1){//显示歌曲列表事件
remove(buttonList1);
listPlayFile.setVisible(true);
buttonList2=new JButton();
buttonList2.setBorderPainted(false);
buttonList2.setBounds(1180,696,30,30);
Icon icon=new ImageIcon(".//list1.jpg");
buttonList2.setIcon(icon);
add(buttonList2);
buttonList2.addActionListener(this);
validate();
repaint();
}
else if(e.getSource()==buttonList2){
remove(buttonList2);
listPlayFile.setVisible(false);
buttonList1=new JButton();
buttonList1.setBorderPainted(false);
buttonList1.setBounds(1180,696,30,30);
Icon icon=new ImageIcon(".//list1.jpg");
buttonList1.setIcon(icon);
add(buttonList1);
buttonList1.addActionListener(this);
validate();
repaint();
}
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
void init(){//添加的控件
Icon img=new ImageIcon(".//background.jpg"); //创建图标对象
background = new JLabel(img);//设置背景图片
background.setBounds(0,0,1280,800);//设置背景控件大小
getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));//背景图片控件置于最底层
((JPanel)getContentPane()).setOpaque(false); //控件透明
img=new ImageIcon(".//timg.gif");
cartoon =new JLabel(img);
cartoon.setBounds(100,197,440,330);
add(cartoon);
buttonmin=new JButton();//添加最小按钮
buttonmin.setBorderPainted(false);
buttonmin.setBounds(1175,22,40,31); //设置最小按钮大小
Icon icon=new ImageIcon(".//min1.jpg");//创建最小图标对象
buttonmin.setIcon(icon); //设置最小图标
add(buttonmin);//添加最小按钮至窗口
buttonexit=new JButton();
buttonexit.setBorderPainted(false);
buttonexit.setBounds(1220,20,38,30);
icon=new ImageIcon(".//exit1.jpg");
buttonexit.setIcon(icon);
add(buttonexit);
buttonexit.addMouseListener(new MouseAdapter() { // 对buttonexit按钮添加监听事件
@Override
public void mouseClicked(MouseEvent e) { // 当鼠标点击时
System.exit(0); // 退出
}
});
buttonPlay=new JButton();
buttonPlay.setBorderPainted(false);
buttonPlay.setBounds(90,687,43,45);
icon=new ImageIcon(".//play.jpg");
buttonPlay.setIcon(icon);
add(buttonPlay);
buttonPlay.addActionListener(this);
buttonPrev=new JButton();
buttonPrev.setBorderPainted(false);
buttonPrev.setBounds(40,690,38,40);
icon=new ImageIcon(".//prev.jpg");
buttonPrev.setIcon(icon);
add(buttonPrev);
buttonPrev.addActionListener(this);
buttonNext=new JButton();
buttonNext.setBorderPainted(false);
buttonNext.setBounds(145,690,38,40);
icon=new ImageIcon(".//next.jpg");
buttonNext.setIcon(icon);
add(buttonNext);
buttonNext.addActionListener(this);
buttonlist=new JButton();
buttonlist.setBorderPainted(false);
buttonlist.setBounds(1078,696,30,30);
icon=new ImageIcon(".//listplay.jpg");
buttonlist.setIcon(icon);
add(buttonlist);
buttonlist.addActionListener(this);
buttonOpen=new JButton();
buttonOpen.setBorderPainted(false);
buttonOpen.setBounds(1130,700,25,25);
icon=new ImageIcon(".//open.jpg");
buttonOpen.setIcon(icon);
add(buttonOpen);
buttonOpen.addActionListener(this);
buttonList1=new JButton();
buttonList1.setBorderPainted(false);
buttonList1.setBounds(1180,696,30,30);
icon=new ImageIcon(".//list1.jpg");
buttonList1.setIcon(icon);
add(buttonList1);
buttonList1.addActionListener(this);
listPlayFile=new JList(); //创建播放列表
listPlayFile.setBounds(680,125,300,200); //设置播放列表大小
listPlayFile.setOpaque(false);//设置播放列表透明
listPlayFile.setVisible(false);
listPlayFile.setBackground(new Color(0, 0, 0, 0));//设置播放列表背景颜色
listPlayFile.setForeground(Color.blue);//设置播放列表字体颜色
Font font=new Font("隶书",Font_PLAIN,20);
listPlayFile.setFont(font);
add(listPlayFile); //添加播放列表至窗口中
listPlayFile.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
int i = listPlayFile.getSelectedIndex();
playPath=Music.get(i).musicPath;
playName=Music.get(i).musicName;
nTimer.cancel();
play_init(playName,playPath);
}
}
});
textLyrics1=new JTextPane(); //创建已播放歌词控件
textLyrics1.setBounds(1020,100,250,250);
textLyrics1.setForeground(Color.red);
Font f=new Font("隶书",Font_PLAIN,20);
textLyrics1.setFont(f);
textLyrics1.setOpaque(false);
add(textLyrics1);
textLyrics2=new JTextPane(); //创建当前播放歌词控件
textLyrics2.setBounds(1010,350,250,36);
textLyrics2.setForeground(Color.BLUE);
f=new Font("隶书",Font_PLAIN,22);
textLyrics2.setFont(f);
textLyrics2.setOpaque(false);
textLyrics2.setText("请先打开文件!");
add(textLyrics2);
textLyrics3=new JTextPane(); //创建未播放歌词控件
textLyrics3.setBounds(1020,390,250,258);//设置歌词控件大小
textLyrics3.setForeground(Color.red);//歌词控件字体颜色
f=new Font("隶书",Font.PLAIN,20);
textLyrics3.setFont(f);
textLyrics3.setOpaque(false);//歌词控件透明
add(textLyrics3); //添加歌词控件至窗口中
time=new JTextPane();//定义时间显示窗
time.setBounds(200,696,50,25);
time.setForeground(Color.BLACK);
f=new Font("仿宋",Font_PLAIN,15);
time.setFont(f);
time.setOpaque(false);
add(time);
Icon img2=new ImageIcon(".//time.jpg"); //创建图标对象
playTime = new JLabel(img2); //创建播放进度条对象
playTime.setBounds(265,707,713,6); //设置播放进度条对象大小
add(playTime); //添加播放进度条至窗口中
}
public void timerFun(){//定时器函数
if(nTimer!=null){nTimer.cancel();}//已经有定时器则关闭
nTimer = new Timer();//创建定时器
nTimer.schedule(new TimerTask(){ //匿名类
int n=0;
int nPlayTime=0;//设置播放时间
public void run() { //定时器
playTime.setBounds(265,707, nPlayTime+=6, 6);
int t=nPlayTime/6;//秒
if(t<=9){
time.setText("00:0"+t);
}
else if(t<60){
time.setText("00:"+t);
}
else if(t<=69){
int a=t/60;
int b=t%60;
time.setText("0"+a+":0"+b);
}
else{
int a=t/60;
int b=t%60;
time.setText("0"+a+":"+b);
}
String s="";
String s1="";
if (t==time0[n]) {
textLyrics2.setText(lyc[n]);
for(int i=n+1;i<lyc.length;i++) {
s=s+lyc[i];
}
textLyrics3.setText(s);
if(n<=9){
for(int i=0;i<=(9-n);i++){
s1+="\n";
}
for(int i=0;i<n;i++){
s1+=lyc[i];
}
textLyrics1.setText(s1);
}
else {
for(int i=n-1;i>=(n-10);i--){
s1=lyc[i]+s1;
}
textLyrics1.setText(s1);
}
n++;
}
if(t==TIME){
nTimer.cancel();
switch(schemaflag){
case 0:{
int m = 0;
for(int i=Music.size()-1;i>=0;i--){
if(Music.get(i).musicPath.equals(playPath)){
m = i;
break;
}
}
if(m+1>=Music.size()){
playPath=Music.get(0).musicPath;
playName=Music.get(0).musicName;
play_init(playName,playPath);
}
else{
playPath=Music.get(m+1).musicPath;
playName=Music.get(m+1).musicName;
play_init(playName,playPath);
}
}
case 1:{
play_init(playName,playPath);
}
case 2:{
Random random=new Random();
int m=random.nextInt(Music.size());
playPath=Music.get(m).musicPath;
playName=Music.get(m).musicName;
play_init(playName,playPath);
}
}
}
}
},0,1000);
}
}
public class MusicPlay{
public static void main(String[] args) {
final MyExtendsJFrame frame=new MyExtendsJFrame();//创建窗口
frame.buttonmin.addActionListener(new ActionListener(){//点集最小化按钮实现最小化
@Override public void actionPerformed(ActionEvent e){
frame.setExtendedState(JFrame.ICONIFIED);
}
});
new MobileTool(frame);
}
}
.\\表示当前工程下目录
图片的话可以自己用ps抠。