用JAVA编写播放器从何开始? 如果要学习如何用JAVA编写一个播放器,不知道要学习那些知识呢?本人已经基本上掌握J2SE了,但如果要编写一个播放器就没什么头绪。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 刚看了论坛上类似的帖子,似乎要去了解下JMF(怎么变了自问自答了) <embed src=<%=filepath%> autostart="true" loop="true" width="369" height="291"> 给个地址,楼主可以去借鉴一下http://qzone.qq.com/blog/363331810-1219692697 给你个代码,自己研究吧。MediaPlayer.java----------------------------------------------------------------------------//程序主文件import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.media.*;import java.io.*;import java.util.*;//为了导入Vector//import com.sun.java.swing.plaf.windows.*;public class MediaPlayer extends JFrame implements ActionListener,Runnable{private JMenuBar bar;//菜单条private JMenu fileMenu,choiceMenu,aboutMenu;private JMenuItem openItem,openDirItem,closeItem,about,infor;private JCheckBoxMenuItem onTop;private boolean top=false,loop;//设定窗口是否在最前面private Player player;//Play是个实现Controller的接口private File file,listFile;//利用File类结合JFileChooser进行文件打开操作,后则与list.ini有关private Container c;//private UIManager.LookAndFeelInfo[] look;private String title,listIniAddress;//标题private FileDialog fd;private JPanel panel,panelSouth;private Icon icon; //开始进入的时候要显示的图标,它为抽象类,不能自己创建private JLabel label,listB;//用来显示图标 private JList list;//播放清单 private JScrollPane scroll;//使播放清单具有滚动功能 private ListValues listWriteFile;//用于向文件中读取对象 private ObjectInputStream input;//对象输入流 private ObjectOutputStream output;//对象输出流 private JPopupMenu popupMenu;//鼠标右键弹出菜单 private JMenuItem del,delAll,reName; //弹出菜单显示的菜单项,包括删除,全部删除和重命名 private Vector fileName,dirName,numList; private String files,dir; private int index;//曲目指针 private Properties prop;//获得系统属性 private int indexForDel;//标志要删除的列表项目的索引 private ButtonGroup buttonGroup;//控制按钮组 private JRadioButtonMenuItem[] buttonValues; private String[] content={"随机播放","顺序播放","单曲循环"}; private DialogDemo dialog1; //private JDialogTest dialog2;//用于显示播放清单 MediaPlayer()//构造函数{ super("java音频播放器1.1版");//窗口标题 c=getContentPane(); c.setLayout(new BorderLayout()); //c.setBackground(new Color(40,40,95)); fileName=new Vector(1); dirName=new Vector(1); numList=new Vector(1);//构造三个容器用于支持播放清单 //vectorToString=new String[]; //prop=new Properties(System.getProperties()); //listIniAddress=prop.getProperty("user.dir")+"\\list.ini"; //listFile=new File(listIniAddress);//本来这些代码用来取的系统属性,后来 //发现根本就不用这么麻烦 listFile=new File("list.ini");//直接存于此目录 Thread readToList=new Thread(this);//注意编线程程序的时候要注意运行的时候含有的变量亿定义或者初始化, //这就要求线程要等上述所说的情况下再运行,否则很容易发生错误或则异常 list=new JList(); list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); list.setSelectionForeground(new Color(0,150,150)); list.setVisibleRowCount(10); list.setFixedCellHeight(12); list.setFixedCellWidth(250); list.setFont(new Font("Serif",Font.PLAIN,12)); list.setBackground(new Color(40,40,95)); list.setForeground(new Color(0,128,255)); //list.setOpaque(false); list.setToolTipText("点右键显示更多功能");//创建播放清单并设置各个属性 list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) //判断是否双击 { index = list.locationToIndex(e.getPoint());//将鼠标坐标转化成list中的选项指针 createPlayer2(); //System.out.println("Double clicked on Item " + index);,此是测试的时候加的 } } /* public void mousePressed(MouseEvent e) { checkMenu(e);//自定义函数,判断是否是右键,来决定是否显示菜单 }*/ public void mouseReleased(MouseEvent e) { checkMenu(e);//与上面的一样,判断是否鼠标右键 } } ); //listB=new JLabel(new ImageIcon("qingdan.gif"),SwingConstants.CENTER); scroll=new JScrollPane(list);//用于存放播放列表 //dialog2=new JDialogTest(MediaPlayer.this,"播放清单",scroll); //dialog2.setVisible(true); readToList.start();//启动先程,加载播放列表 try { Thread.sleep(10); } catch(InterruptedException e) { e.printStackTrace(); } /*look=UIManager.getInstalledLookAndFeels(); try { UIManager.setLookAndFeel(look[2].getClassName()); SwingUtilities.updateComponentTreeUI(this); } catch(Exception e) { e.printStackTrace(); }*///与下面的代码实现相同的功能,但执行速度要慢,原因:明显转了个大弯 /*try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } *///此段代码使执行速度大大降低 bar=new JMenuBar(); setJMenuBar(bar);//此两行创建菜单栏并放到此窗口程序 //bar.setBackground(new Color(48,91,183)); fileMenu=new JMenu("文件"); bar.add(fileMenu); choiceMenu=new JMenu("控制"); bar.add(choiceMenu); aboutMenu=new JMenu("帮助"); bar.add(aboutMenu); openItem =new JMenuItem("打开文件"); openDirItem =new JMenuItem("打开目录"); closeItem =new JMenuItem("退出程序"); openItem.addActionListener(this); openDirItem.addActionListener(this); closeItem.addActionListener(this); fileMenu.add(openItem); fileMenu.add(openDirItem); fileMenu.add(closeItem); onTop=new JCheckBoxMenuItem("播放时位于最前面",top); choiceMenu.add(onTop); onTop.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if(onTop.isSelected()) top=true; else top=false; setAlwaysOnTop(top); } } ); choiceMenu.addSeparator();//加分割符号 buttonGroup=new ButtonGroup(); buttonValues=new JRadioButtonMenuItem[3]; for(int bt=0;bt<3;bt++) { buttonValues[bt]=new JRadioButtonMenuItem(content[bt]); buttonGroup.add(buttonValues[bt]); choiceMenu.add(buttonValues[bt]); } buttonValues[0].setSelected(true); choiceMenu.addSeparator(); /*loopItem=new JCheckBoxMenuItem("是否循环"); choiceMenu.add(loopItem); loopItem.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { loop=!loop; } } );*/ infor=new JMenuItem("软件简介"); aboutMenu.add(infor); infor.addActionListener(this); about=new JMenuItem("关于作者"); about.addActionListener(this); aboutMenu.add(about); //菜单栏设置完毕 panel=new JPanel(); panel.setLayout(new BorderLayout()); c.add(panel,BorderLayout.CENTER); panelSouth=new JPanel(); panelSouth.setLayout(new BorderLayout()); c.add(panelSouth,BorderLayout.SOUTH); icon=new ImageIcon("icon\\Player.jpg"); label=new JLabel(icon); panel.add(label); popupMenu=new JPopupMenu(); del =new JMenuItem("删除");//鼠标右键弹出菜单对象实例化 popupMenu.add(del); del.addActionListener(this); delAll =new JMenuItem("全部删除"); popupMenu.add(delAll); delAll.addActionListener(this); reName =new JMenuItem("重命名"); popupMenu.add(reName); reName.addActionListener(this); scroll=new JScrollPane(list);//用于存放播放列表 listB=new JLabel(new ImageIcon("icon\\qingdan.gif"),SwingConstants.CENTER); panelSouth.add(listB,BorderLayout.NORTH); panelSouth.add(scroll,BorderLayout.CENTER); dialog1=new DialogDemo(MediaPlayer.this,"软件说明"); this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//设定窗口关闭方式 //this.setTitle("d");编译通过,说明可以再次设定标题 this.setLocation(400,250);//设定窗口出现的位置 //this.setSize(350,320);//窗口大小 setSize(350,330); this.setResizable(false);//设置播放器不能随便调大小 this.setVisible(true);//此句不可少,否则窗口会不显示 }public void actionPerformed(ActionEvent e){ if(e.getSource()==openItem)//getSource()判断发生时间的组键 { //System.out.println("d");测试用 openFile(); //createPlayer(); //setTitle(title); } if(e.getSource()==openDirItem)//打开目录 { openDir(); } if(e.getSource()==closeItem)//推出播放器 { exity_n(); //System.exit(0); } if(e.getSource()==about) { JOptionPane.showMessageDialog(this,"此简易播放器由计科0302\n" +"harly\n "+" 完成 ", "参与者", JOptionPane.INFORMATION_MESSAGE); } if(e.getSource()==del) { //index //delPaintList(index); fileName.removeElementAt(indexForDel); dirName.removeElementAt(indexForDel); numList.removeAllElements();//从三个容器里面移除此项 Enumeration enumFile=fileName.elements(); while(enumFile.hasMoreElements()) { numList.addElement((numList.size()+1)+"."+enumFile.nextElement()); //numList添加元素,显示播放里表中 } //list.setListData(fileName); list.setListData(numList); if(index<indexForDel) list.setSelectedValue(numList.elementAt(index),true); else { if(index==indexForDel); else if(index!=0) list.setSelectedValue(numList.elementAt(index-1),true); } //list.setSelectedIndex(index); } if(e.getSource()==delAll)//全部删除 { fileName.removeAllElements(); dirName.removeAllElements(); numList.removeAllElements(); list.setListData(numList); } if(e.getSource()==reName)//重命名 { String name;//=JOptionPane.showInputDialog(this,"请输入新的名字"); try { name=reNames(); fileName.setElementAt(name,indexForDel); numList.setElementAt((indexForDel+1)+"."+name,indexForDel); } catch(ReName e2)//自定义的异常 { } } if(e.getSource()==infor) { dialog1.setVisible(true); }}public static void main(String[] args){ final MediaPlayer mp=new MediaPlayer(); mp.setIconImage(new ImageIcon("icon\\mPlayer.jpg").getImage());//改变默认图标 mp.addWindowListener(new WindowAdapter()//注册窗口事件 { public void windowClosing(WindowEvent e) { //System.exit(0); mp.exity_n(); } } ); System.out.println("注意:更新文件列表后,请先正常关闭播放器" +"\n然后再关闭此DOS窗口,否则导致播放列表不能保存!!");}private void openFile()//为了界面原因,此代码重写,估计兼容性不好了{ /*JFileChooser fileChooser=new JFileChooser();//文件选择器 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//可以选择文件不能目录 int result=fileChooser.showOpenDialog(this);//创建文件打开对话框,并设定此程序为父窗口监控*/ /*通过result的值来判断文件是否打开成功 *JFileChooser类有很多静态成员变量 **/ /*if(result==JFileChooser.CANCEL_OPTION) { file=null;//file已经在类中定义,如果选择取消,file指向为空 } else { file=fileChooser.getSelectedFile();//获得文件对象 title=file.getAbsolutePath();//取得文件的绝对路径并且赋给title设定标题 }*/ //if(fd==null) //{ //String filename="java音频播放器"; fd = new FileDialog(MediaPlayer.this); //Filters fl=new Filters(); //fd.setFilenameFilter(fl); fd.setVisible(true); if (fd.getFile() != null) { title = fd.getDirectory() + fd.getFile();//原因请见同目录下的FileDialogDemo.java文件 files=fd.getFile(); //dir =fd.getDirectory(); file=new File(title); createPlayer(); } //title=filename; //fd=null;//缺少此句如果第一次打开文件的时候取消操作的时候第二次也不能打开文件了 //}}private void openDir(){ JFileChooser fileChooser=new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int result=fileChooser.showOpenDialog(MediaPlayer.this); if(result==JFileChooser.CANCEL_OPTION) return; file=fileChooser.getSelectedFile(); if(file==null||file.getName().equals("")) JOptionPane.showMessageDialog(this,"错误的路径", "出错了",JOptionPane.ERROR_MESSAGE); String[] sFiles=file.list(); for(int i=0;i<sFiles.length;i++) { fileName.addElement(sFiles); numList.addElement((numList.size()+1)+"."+sFiles); dirName.addElement(file.getAbsolutePath()+"\\"+sFiles); } list.setListData(numList); /*fd=new FileDialog(MediaPlayer.this); fd.setVisible(true); if(fd.getDirectory()!=null) { File fileDir=new File(fd.getDirectory()); String[] ss=fileDir.list(); for(int i=0;i<ss.length;i++) { System.out.println(ss); } }*/}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); //list.setSelectedIndex(index); //list.setSelectionForeground(Color.blue); setTitle(title); //addList("files");//到播放清单 //title="file.getAbsoluteFile()"; } catch(Exception e) { JOptionPane.showMessageDialog(this,extendName,"出错了!!",JOptionPane.ERROR_MESSAGE); setTitle(extendName); } } 用JAVA去写播放器,噶无聊啊。用C#就比较快了。JAVA么写写J2EE项目的呀,谁吃饱了撑的去写桌面应用。 用JMF,网上多的是,java播放器的 呵呵,不会也不要打击楼主的积极性嘛~虽说java写的桌面应用不怎么样,这是兴趣,明白吗?不是为了写项目,而是为了自己的兴趣才编程,我认为这是最爽快的 是啊,C#里现成的WMP com控件,拖过来自己写几行代码就能播放了,呵呵。 jmf.以前试图写过,但是好像JAVA不擅长这个 import javax.media.*;API javax中并无media类 用IO库把一个大的txt文件变成若干个小的文件 求ContextClassLoader示例 javascript vbscript 小问题 我想通过一次比赛来提高自已,但是这个题一些细节问题看不懂,请个位高手指点一下!! 求一算法 关于接口和继承的基础知识的一个疑问 关于apathe安装的问题 有关于GridBagLayout的布局问题,为什么设置gridx,gridy没有效果? alin19(资深爪哇师傅) 请进 请教:Applet引用了Swing,为何在IE中没法运行啊? java的GridBagLayout的使用情况 JSP页面乱码问题
height="291">
----------------------------------------------------------------------------
//程序主文件
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.media.*;
import java.io.*;
import java.util.*;//为了导入Vector
//import com.sun.java.swing.plaf.windows.*;public class MediaPlayer extends JFrame implements ActionListener,Runnable
{
private JMenuBar bar;//菜单条
private JMenu fileMenu,choiceMenu,aboutMenu;
private JMenuItem openItem,openDirItem,closeItem,about,infor;
private JCheckBoxMenuItem onTop;
private boolean top=false,loop;//设定窗口是否在最前面
private Player player;//Play是个实现Controller的接口
private File file,listFile;//利用File类结合JFileChooser进行文件打开操作,后则与list.ini有关
private Container c;
//private UIManager.LookAndFeelInfo[] look;
private String title,listIniAddress;//标题
private FileDialog fd;
private JPanel panel,panelSouth;
private Icon icon; //开始进入的时候要显示的图标,它为抽象类,不能自己创建
private JLabel label,listB;//用来显示图标 private JList list;//播放清单
private JScrollPane scroll;//使播放清单具有滚动功能
private ListValues listWriteFile;//用于向文件中读取对象
private ObjectInputStream input;//对象输入流
private ObjectOutputStream output;//对象输出流
private JPopupMenu popupMenu;//鼠标右键弹出菜单
private JMenuItem del,delAll,reName; //弹出菜单显示的菜单项,包括删除,全部删除和重命名
private Vector fileName,dirName,numList;
private String files,dir;
private int index;//曲目指针
private Properties prop;//获得系统属性
private int indexForDel;//标志要删除的列表项目的索引
private ButtonGroup buttonGroup;//控制按钮组
private JRadioButtonMenuItem[] buttonValues;
private String[] content={"随机播放","顺序播放","单曲循环"};
private DialogDemo dialog1;
//private JDialogTest dialog2;//用于显示播放清单
MediaPlayer()//构造函数
{
super("java音频播放器1.1版");//窗口标题
c=getContentPane();
c.setLayout(new BorderLayout());
//c.setBackground(new Color(40,40,95));
fileName=new Vector(1);
dirName=new Vector(1);
numList=new Vector(1);//构造三个容器用于支持播放清单
//vectorToString=new String[];
//prop=new Properties(System.getProperties());
//listIniAddress=prop.getProperty("user.dir")+"\\list.ini";
//listFile=new File(listIniAddress);//本来这些代码用来取的系统属性,后来
//发现根本就不用这么麻烦
listFile=new File("list.ini");//直接存于此目录
Thread readToList=new Thread(this);//注意编线程程序的时候要注意运行的时候含有的变量亿定义或者初始化,
//这就要求线程要等上述所说的情况下再运行,否则很容易发生错误或则异常
list=new JList();
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
list.setSelectionForeground(new Color(0,150,150));
list.setVisibleRowCount(10);
list.setFixedCellHeight(12);
list.setFixedCellWidth(250);
list.setFont(new Font("Serif",Font.PLAIN,12));
list.setBackground(new Color(40,40,95));
list.setForeground(new Color(0,128,255));
//list.setOpaque(false);
list.setToolTipText("点右键显示更多功能");//创建播放清单并设置各个属性
list.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2) //判断是否双击
{
index = list.locationToIndex(e.getPoint());//将鼠标坐标转化成list中的选项指针
createPlayer2();
//System.out.println("Double clicked on Item " + index);,此是测试的时候加的
}
}
/* public void mousePressed(MouseEvent e)
{
checkMenu(e);//自定义函数,判断是否是右键,来决定是否显示菜单
}*/
public void mouseReleased(MouseEvent e)
{
checkMenu(e);//与上面的一样,判断是否鼠标右键
} }
);
//listB=new JLabel(new ImageIcon("qingdan.gif"),SwingConstants.CENTER);
scroll=new JScrollPane(list);//用于存放播放列表
//dialog2=new JDialogTest(MediaPlayer.this,"播放清单",scroll);
//dialog2.setVisible(true);
readToList.start();//启动先程,加载播放列表
try
{
Thread.sleep(10);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
/*look=UIManager.getInstalledLookAndFeels();
try
{
UIManager.setLookAndFeel(look[2].getClassName());
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e)
{
e.printStackTrace();
}*///与下面的代码实现相同的功能,但执行速度要慢,原因:明显转了个大弯
/*try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e)
{
e.printStackTrace();
} *///此段代码使执行速度大大降低
bar=new JMenuBar();
setJMenuBar(bar);//此两行创建菜单栏并放到此窗口程序
//bar.setBackground(new Color(48,91,183));
fileMenu=new JMenu("文件");
bar.add(fileMenu);
choiceMenu=new JMenu("控制");
bar.add(choiceMenu);
aboutMenu=new JMenu("帮助");
bar.add(aboutMenu);
openItem =new JMenuItem("打开文件");
openDirItem =new JMenuItem("打开目录");
closeItem =new JMenuItem("退出程序");
openItem.addActionListener(this);
openDirItem.addActionListener(this);
closeItem.addActionListener(this);
fileMenu.add(openItem);
fileMenu.add(openDirItem);
fileMenu.add(closeItem);
onTop=new JCheckBoxMenuItem("播放时位于最前面",top);
choiceMenu.add(onTop);
onTop.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(onTop.isSelected())
top=true;
else top=false;
setAlwaysOnTop(top);
}
}
);
choiceMenu.addSeparator();//加分割符号
buttonGroup=new ButtonGroup();
buttonValues=new JRadioButtonMenuItem[3];
for(int bt=0;bt<3;bt++)
{
buttonValues[bt]=new JRadioButtonMenuItem(content[bt]);
buttonGroup.add(buttonValues[bt]);
choiceMenu.add(buttonValues[bt]);
}
buttonValues[0].setSelected(true);
choiceMenu.addSeparator();
/*loopItem=new JCheckBoxMenuItem("是否循环");
choiceMenu.add(loopItem);
loopItem.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
loop=!loop;
}
}
);*/
infor=new JMenuItem("软件简介");
aboutMenu.add(infor);
infor.addActionListener(this);
about=new JMenuItem("关于作者");
about.addActionListener(this);
aboutMenu.add(about);
//菜单栏设置完毕
panel=new JPanel();
panel.setLayout(new BorderLayout());
c.add(panel,BorderLayout.CENTER);
panelSouth=new JPanel();
panelSouth.setLayout(new BorderLayout());
c.add(panelSouth,BorderLayout.SOUTH);
icon=new ImageIcon("icon\\Player.jpg");
label=new JLabel(icon);
panel.add(label);
popupMenu=new JPopupMenu();
del =new JMenuItem("删除");//鼠标右键弹出菜单对象实例化
popupMenu.add(del);
del.addActionListener(this);
delAll =new JMenuItem("全部删除");
popupMenu.add(delAll);
delAll.addActionListener(this);
reName =new JMenuItem("重命名");
popupMenu.add(reName);
reName.addActionListener(this);
scroll=new JScrollPane(list);//用于存放播放列表
listB=new JLabel(new ImageIcon("icon\\qingdan.gif"),SwingConstants.CENTER);
panelSouth.add(listB,BorderLayout.NORTH);
panelSouth.add(scroll,BorderLayout.CENTER);
dialog1=new DialogDemo(MediaPlayer.this,"软件说明");
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//设定窗口关闭方式
//this.setTitle("d");编译通过,说明可以再次设定标题
this.setLocation(400,250);//设定窗口出现的位置
//this.setSize(350,320);//窗口大小
this.setResizable(false);//设置播放器不能随便调大小
this.setVisible(true);//此句不可少,否则窗口会不显示
}public void actionPerformed(ActionEvent e)
{
if(e.getSource()==openItem)//getSource()判断发生时间的组键
{
//System.out.println("d");测试用
openFile();
//createPlayer();
//setTitle(title);
}
if(e.getSource()==openDirItem)//打开目录
{
openDir();
}
if(e.getSource()==closeItem)//推出播放器
{
exity_n();
//System.exit(0);
}
if(e.getSource()==about)
{
JOptionPane.showMessageDialog(this,"此简易播放器由计科0302\n"
+"harly\n "+" 完成 ",
"参与者",
JOptionPane.INFORMATION_MESSAGE);
}
if(e.getSource()==del)
{
//index
//delPaintList(index);
fileName.removeElementAt(indexForDel);
dirName.removeElementAt(indexForDel);
numList.removeAllElements();//从三个容器里面移除此项
Enumeration enumFile=fileName.elements();
while(enumFile.hasMoreElements())
{
numList.addElement((numList.size()+1)+"."+enumFile.nextElement());
//numList添加元素,显示播放里表中
}
//list.setListData(fileName);
list.setListData(numList);
if(index<indexForDel)
list.setSelectedValue(numList.elementAt(index),true);
else
{
if(index==indexForDel);
else
if(index!=0)
list.setSelectedValue(numList.elementAt(index-1),true);
}
//list.setSelectedIndex(index);
}
if(e.getSource()==delAll)//全部删除
{
fileName.removeAllElements();
dirName.removeAllElements();
numList.removeAllElements();
list.setListData(numList);
}
if(e.getSource()==reName)//重命名
{
String name;//=JOptionPane.showInputDialog(this,"请输入新的名字");
try
{
name=reNames();
fileName.setElementAt(name,indexForDel);
numList.setElementAt((indexForDel+1)+"."+name,indexForDel);
}
catch(ReName e2)//自定义的异常
{
}
}
if(e.getSource()==infor)
{
dialog1.setVisible(true);
}
}public static void main(String[] args)
{
final MediaPlayer mp=new MediaPlayer();
mp.setIconImage(new ImageIcon("icon\\mPlayer.jpg").getImage());//改变默认图标
mp.addWindowListener(new WindowAdapter()//注册窗口事件
{
public void windowClosing(WindowEvent e)
{
//System.exit(0);
mp.exity_n();
}
}
);
System.out.println("注意:更新文件列表后,请先正常关闭播放器"
+"\n然后再关闭此DOS窗口,否则导致播放列表不能保存!!");
}private void openFile()//为了界面原因,此代码重写,估计兼容性不好了
{
/*JFileChooser fileChooser=new JFileChooser();//文件选择器
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//可以选择文件不能目录
int result=fileChooser.showOpenDialog(this);//创建文件打开对话框,并设定此程序为父窗口监控*/
/*通过result的值来判断文件是否打开成功
*JFileChooser类有很多静态成员变量
**/
/*if(result==JFileChooser.CANCEL_OPTION)
{
file=null;//file已经在类中定义,如果选择取消,file指向为空
}
else
{
file=fileChooser.getSelectedFile();//获得文件对象
title=file.getAbsolutePath();//取得文件的绝对路径并且赋给title设定标题
}*/
//if(fd==null)
//{
//String filename="java音频播放器";
fd = new FileDialog(MediaPlayer.this);
//Filters fl=new Filters();
//fd.setFilenameFilter(fl);
fd.setVisible(true);
if (fd.getFile() != null)
{
title = fd.getDirectory() + fd.getFile();//原因请见同目录下的FileDialogDemo.java文件
files=fd.getFile();
//dir =fd.getDirectory();
file=new File(title);
createPlayer();
}
//title=filename;
//fd=null;//缺少此句如果第一次打开文件的时候取消操作的时候第二次也不能打开文件了
//}
}
private void openDir()
{
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result=fileChooser.showOpenDialog(MediaPlayer.this);
if(result==JFileChooser.CANCEL_OPTION)
return;
file=fileChooser.getSelectedFile();
if(file==null||file.getName().equals(""))
JOptionPane.showMessageDialog(this,"错误的路径",
"出错了",JOptionPane.ERROR_MESSAGE);
String[] sFiles=file.list();
for(int i=0;i<sFiles.length;i++)
{
fileName.addElement(sFiles);
numList.addElement((numList.size()+1)+"."+sFiles);
dirName.addElement(file.getAbsolutePath()+"\\"+sFiles);
}
list.setListData(numList);
/*fd=new FileDialog(MediaPlayer.this);
fd.setVisible(true);
if(fd.getDirectory()!=null)
{
File fileDir=new File(fd.getDirectory());
String[] ss=fileDir.list();
for(int i=0;i<ss.length;i++)
{
System.out.println(ss);
}
}*/
}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);
//list.setSelectedIndex(index);
//list.setSelectionForeground(Color.blue);
setTitle(title);
//addList("files");//到播放清单
//title="file.getAbsoluteFile()";
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this,extendName,"出错了!!",JOptionPane.ERROR_MESSAGE);
setTitle(extendName);
}
}
虽说java写的桌面应用不怎么样,这是兴趣,明白吗?
不是为了写项目,而是为了自己的兴趣才编程,我认为这是最爽快的
API javax中并无media类