如果要学习如何用JAVA编写一个播放器,不知道要学习那些知识呢?本人已经基本上掌握J2SE了,但如果要编写一个播放器就没什么头绪。

解决方案 »

  1.   

    刚看了论坛上类似的帖子,似乎要去了解下JMF(怎么变了自问自答了)
      

  2.   

    <embed src=<%=filepath%> autostart="true" loop="true" width="369"
                        height="291">
      

  3.   

    给个地址,楼主可以去借鉴一下http://qzone.qq.com/blog/363331810-1219692697
      

  4.   

    给你个代码,自己研究吧。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);//窗口大小
      

  5.   

      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);
      }
       
    }
      

  6.   

    用JAVA去写播放器,噶无聊啊。用C#就比较快了。JAVA么写写J2EE项目的呀,谁吃饱了撑的去写桌面应用。
      

  7.   

    用JMF,网上多的是,java播放器的
      

  8.   

    呵呵,不会也不要打击楼主的积极性嘛~
    虽说java写的桌面应用不怎么样,这是兴趣,明白吗?
    不是为了写项目,而是为了自己的兴趣才编程,我认为这是最爽快的
      

  9.   

    是啊,C#里现成的WMP com控件,拖过来自己写几行代码就能播放了,呵呵。
      

  10.   

    jmf.以前试图写过,但是好像JAVA不擅长这个
      

  11.   

    import javax.media.*;
    API javax中并无media类