📄 mediaplayer.java
字号:
private void createPlayer()
{
closePreviosPlayer();//关闭先前的媒体播放器
String extendName="此播放器不支持"+title.substring(title.lastIndexOf(".")+1)+"格式";
try
{
player=Manager.createPlayer(file.toURL());//javax.media.Manager直接继承于java.lang.object,且它为final,不能被继承
player.addControllerListener(new ControllerHand());
player.start();
addList(files);
index=fileName.size()-1;
list.setSelectedValue(numList.elementAt(index),true);
setTitle(title);
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this,extendName,"出错了!!",JOptionPane.ERROR_MESSAGE);
setTitle(extendName);
}
}
private void closePreviosPlayer()//把先前打开的播放器关闭
{
if(player==null)
return;
player.stop();
player.deallocate(); //停止播放并且重新装载DateSource
Component visual =player.getVisualComponent();
Component control=player.getControlPanelComponent();
if(visual!=null)
{
panel.remove(visual);
}
if(control!=null)
{
panel.remove(control);
}
}
private class ControllerHand implements ControllerListener
{
public void controllerUpdate(ControllerEvent e)
{
if(e instanceof RealizeCompleteEvent)//如果是实例化完成事件
{
Component visual=player.getVisualComponent();//获得一个播放所有视频媒体的可视组件
if(visual!=null)//如果图象存在则去掉以前的图象加载当前图象
{
panel.removeAll();
panel.add(visual,BorderLayout.CENTER);
}
Component control=player.getControlPanelComponent();//是一个操作时间轴的可视组件(包括开始,停止,回放),
//也包含了一些媒体流的有用信息
if(control!=null)
{
panel.add(control,BorderLayout.SOUTH);
}
panel.doLayout();//提示布局管理器布局此组件,否则布局的位置不正确
return;
}
if (e instanceof EndOfMediaEvent) //如果到达了文件尾则进行如下事件
{
if(buttonValues[0].isSelected())//进行随即播放
{
if(fileName.size()==0)
return;
index=(int)(Math.random()*fileName.size());
}
if(buttonValues[1].isSelected())//进行顺序循环播放
{
if(fileName.size()==0)
return;//必须有此if语句,否则当用户把播放列表清空的时候发生异常,偶然的机会发现的
//现在感觉测试软件真是太重要了,看来以后程序做好后要反复测试,考虑各种情况
index=(index+1)%fileName.size();
}
if(buttonValues[2].isSelected())//进行单曲播放
{
player.setMediaTime (new Time (0)); //将时间返回开始的0时刻然后播放
player.start();
}
createPlayer2();
}
}
}
private void exity_n()//退出操作,先保存列表,然后退出
{
saveList();
System.exit(0);
}
//清单改变一次就重新载入一次
private void addList(String vf)//像播放清单中增加选项
{
fileName.addElement(vf);
numList.addElement((numList.size()+1)+"."+vf);
dirName.addElement(title);
list.setListData(numList);
}
private void createPlayer2()//创建一个player对象并使其播放
//当双击鼠标时会播放鼠标击中的歌曲,并且不会出现能播放的格式也播放不了,在刷新文件后(即双击鼠标时更换播放曲目时)使用
{
try{
title=dirName.elementAt(index).toString();//将当前目录名设为title
}
catch(ArrayIndexOutOfBoundsException e)//如果数组越界则返回
{return;}
file=new File(title);//以title为名创建一个file实例,下面将file转换为URL用来创建player对象
closePreviosPlayer();//关闭先前的媒体播放器
String extendName="此播放器不支持"+title.substring(title.lastIndexOf(".")+1)+"格式";
try
{
player=Manager.createPlayer(file.toURL());//javax.media.Manager直接继承于java.lang.object,且它为final,不能被继承 //Manager用来创建Player对象
player.addControllerListener(new ControllerHand());
player.start();//设置为开始播放
list.setSelectedValue(numList.elementAt(index),true);//将当前所在 的位置在list中置为选中项
setTitle(title); //名称为当前目录名称
}
catch(Exception e)//若出现不能播放的格式,则将该文件从播放列表中删除,并且给出相应的提示信息
{
String ex=null;
try{
ex=fileName.elementAt(index).toString();//获得不能播放的文件名称
}
catch(Exception e1){return;}
fileName.removeElementAt(index);
numList.removeAllElements();//将该文件从播放列表中删除
Enumeration enumFile=fileName.elements();//将其他的文件依次向上提前,得到新的播放那个列表
while(enumFile.hasMoreElements())
{
numList.addElement((numList.size()+1)+"."+enumFile.nextElement());
}
dirName.removeElementAt(index);
list.setListData(numList);
JOptionPane.showMessageDialog(this,"已经从播放列表中删除 "+"\""+ex+"\""+" 文件,"
+"因为此播放器不支持"+ex.substring(ex.lastIndexOf(".")+1)+"格式","出错了!!!",JOptionPane.ERROR_MESSAGE);
}
}
private void saveList()//将播放列表保存到list中使下次执行是在上一次执行的基础上
{//Enumeration接口在包java.util 中
//它生成一系列元素,一次生成一个,
//连续调用nextElement方法将返回一系列的连续元素
Enumeration enumFile=fileName.elements();
Enumeration enumDir =dirName.elements();
try
{
output=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(listFile)));
while(enumFile.hasMoreElements())//如果enumFile中有元素则写入文件中
{//将文件名与目录都保存在ListValues对象中最终实现保存在文件中
listWriteFile=new ListValues(enumFile.nextElement().toString(),enumDir.nextElement().toString());
output.writeObject(listWriteFile);//将对象写入文件中
}
output.flush();
output.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()//其中实现了将选择的文件加入到播放列表中
//并进行随即播放,即只要执行该文件(播放列表不空)则就会有歌曲播放
{
try
{
Thread.sleep(1);
}
catch(InterruptedException e)
{
}
try
{
if(!listFile.exists())//如果读取的文件不存在,则创建一个新的文件
{
listFile.createNewFile();
return;
}
input=new ObjectInputStream(new BufferedInputStream(new FileInputStream(listFile)));
//以文件名创建一个对象输入流,然后将该对象加入到播放清单中
while(true)//循环将歌曲对象加入到播放列表中
{//ListValues类实现了接口Serializable
listWriteFile=(ListValues)input.readObject();//将对象读入到listWriteFile类对象中
fileName.addElement(listWriteFile.getFileName());//将文件对象名加入文件名向量中
numList.addElement((numList.size()+1)+"."+listWriteFile.getFileName());//将文件对象加入清单并
//实现加入的对象从1一直向下排序
dirName.addElement(listWriteFile.getDirName());//将目录名加入到目录向量中
}
}
catch(EOFException e)
{
try
{
if(!fileName.isEmpty())
{
input.close();//确认有元素存在并加载完毕后关闭输入流
}
}
catch(IOException e1)
{
JOptionPane.showMessageDialog(this,"文件被非正常关闭",
"非法关闭",JOptionPane.ERROR_MESSAGE);
}
}
catch(ClassNotFoundException e)
{
JOptionPane.showMessageDialog(this,"不能创建对象","对象创建失败",JOptionPane.ERROR_MESSAGE);
}
catch(IOException e)
{
JOptionPane.showMessageDialog(this,"不能读取文件",
"读取文件失败",JOptionPane.ERROR_MESSAGE);
}
finally
{
try
{
if(input!=null)//输入对象流不为空则关闭
input.close();
}
catch(IOException e)
{
}
if(dirName.isEmpty())//防止Vector越界
{
return;
}
index=(int)(Math.random()*(fileName.size()));//产生随即数,进行随即播放
list.setListData(numList);//将载入文件内容加入到list中用以后面进行保存
createPlayer2();
}
}
private void checkMenu(MouseEvent e)//标志选中项
{
if(e.isPopupTrigger())//判断是否要求弹出一个菜单
{
indexForDel=list.locationToIndex(e.getPoint());//获取当前鼠标点使下标转换为用户选中的文件
int[] selected={index,indexForDel};//建立选中数组并赋值
list.setSelectedIndices(selected);//选择索引数组中指定的项目,并更新列表框
popupMenu.show(list,e.getX(),e.getY());//在相对于初始组件list的 x、y 位置显示弹出式菜单
}
}
String reNames()
{
String name=JOptionPane.showInputDialog(this,"请输入新的名字",fileName.elementAt(indexForDel));
return name;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -