import javax.swing.JSlider; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Point;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedOutputStream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable;
import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.EndOfMediaEvent; import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException; import javax.media.Player;
import javax.media.PrefetchCompleteEvent; import javax.media.Time;
import javax.swing.ButtonGroup; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JButton;
import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollBar; import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;
public class MusicPlayer implements ActionListener, Serializable,ControllerListener {
private static final long serialVersionUID = 1L; private JFrame frame = null;
private JPanel controlPanel = null; private JButton btnPlay = null; private JButton btnPre = null; private JButton btnNext = null; private JScrollPane listPane = null; private JList list = null;
private DefaultListModel listModel = null; private JMenuBar menubar = null;
private JMenu menuFile = null, menuAbout = null, menuMode = null; private JMenuItem itemOpen, itemOpens, itemExit, itemAbout;
private JRadioButtonMenuItem itemSingle, itemSequence ,itemRandom; private ListItem currentItem = null; private static Player player = null; private boolean isPause = false; private int mode;
private int currentIndex;
private ImageIcon iconPlay = new ImageIcon(\"d:\\\\1.jpg\"); private ImageIcon iconPre = new ImageIcon(\"d:\\\\3.jpg\"); private ImageIcon iconNext = new ImageIcon(\"d:\\\\2.jpg\"); private ImageIcon iconPause = new ImageIcon(\"d:\\\\4.jpg\"); public static void main(String[] args) { new MusicPlayer(); }
public MusicPlayer() { init(); }
public void init() { frame = new JFrame(); frame.setTitle(\"音乐播放器\"); frame.setSize(400, 300); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); menubar = new JMenuBar(); menuFile = new JMenu(\"文件\"); menuAbout = new JMenu(\"关于\");
menuMode = new JMenu(\"播放模式\"); itemOpen = new JMenuItem(\"添加文件\"); itemOpens = new JMenuItem(\"添加文件夹\"); itemExit = new JMenuItem(\"退出\"); itemAbout = new JMenuItem(\"关于\"); itemOpen.addActionListener(this); itemOpens.addActionListener(this); itemExit.addActionListener(this); itemAbout.addActionListener(this);
itemSequence = new JRadioButtonMenuItem(\"顺序播放\"); itemSequence.setSelected(true);
itemSingle = new JRadioButtonMenuItem(\"单曲循环\"); itemSequence.addActionListener(this);
itemRandom = new JRadioButtonMenuItem(\"随机播放\"); itemRandom.addActionListener(this); itemSingle.addActionListener(this); ButtonGroup bg = new ButtonGroup(); bg.add(itemRandom); bg.add(itemSequence); bg.add(itemSingle);
menuFile.add(itemOpen); menuFile.add(itemOpens); menuFile.add(itemExit); menuAbout.add(itemAbout); menuMode.add(itemSequence); menuMode.add(itemSingle); menuMode.add(itemRandom); menubar.add(menuFile); menubar.add(menuAbout); menubar.add(menuMode); frame.setJMenuBar(menubar);
frame.setLayout(new BorderLayout()); controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout()); btnPlay = new JButton(iconPlay); btnPre = new JButton(iconPre); btnNext = new JButton(iconNext); btnPlay.addActionListener(this); btnPre.addActionListener(this); btnNext.addActionListener(this); controlPanel.add(btnPre); controlPanel.add(btnPlay); controlPanel.add(btnNext); listPane = new JScrollPane();
listModel = load(); list = new JList(listModel); if (list.getSelectedIndex() == -1 && listModel.size() > 0) { currentItem = (ListItem) listModel.get(0); list.setSelectedIndex(0); currentIndex=0; } listPane.getViewport().add(list); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { if(player!=null) { player.close(); btnPlay.setIcon(iconPlay); } currentIndex = list.locationToIndex(e.getPoint()); currentItem = (ListItem) listModel.get(currentIndex); list.setSelectedIndex(currentIndex); play(); } } }); frame.setLayout(new BorderLayout()); frame.add(controlPanel, BorderLayout.NORTH); frame.add(listPane, BorderLayout.CENTER); frame.setVisible(true); };
public void actionPerformed(ActionEvent e) { if (e.getSource() == itemOpen) {// add files JFileChooser jfc = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter(\"音乐文件\ jfc.setFileFilter(filter); jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); jfc.setMultiSelectionEnabled(true); if (jfc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
File[] files = jfc.getSelectedFiles(); for (File f : files) { ListItem item = new ListItem(f.getName(), f.getAbsolutePath()); listModel.addElement(item); } } } else if (e.getSource() == itemOpens) {// add files in a directory JFileChooser jfc = new JFileChooser(); jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (jfc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { File directory = jfc.getSelectedFile(); File[] files = directory.listFiles(new java.io.FileFilter() { public boolean accept(File f) { if (f.getName().toLowerCase().endsWith(\".mp3\")|| f.getName().toLowerCase().endsWith(\".wav\")) return true; return false; } }); for (File file : files) { ListItem item = new ListItem(file.getName(), file.getAbsolutePath()); listModel.addElement(item); } save(listModel); } } else if (e.getSource() == itemExit) { System.exit(0); } else if (e.getSource() == itemAbout) { JOptionPane.showMessageDialog(frame, \"作者:陆鑫\"); } else if (e.getSource() == btnPlay)
{ // play or pause play(); } else if (e.getSource() == btnPre) { pre(); } else if (e.getSource() == btnNext) {// next music next(); } else if (e.getSource() == itemSequence) { mode = 0; } else if (e.getSource() == itemSingle) { mode = 1; } else if (e.getSource() == itemRandom) { mode = 2; } }
// play control /**
* 播放
*/
public void play() { if (btnPlay.getIcon() == iconPlay) { if (isPause) { player.start(); System.out.println(\"暂停结束\"); isPause = false; } else {
try { player = Manager.createPlayer(new MediaLocator(\"file:\"+ currentItem.getPath())); player.addControllerListener(this); // 提取媒体内容 player.prefetch(); } catch (NoPlayerException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } btnPlay.setIcon(iconPause); } else { player.stop(); isPause = true; System.out.println(\"暂停\"); btnPlay.setIcon(iconPlay); } }
public void next() { if (currentIndex == listModel.getSize() - 1) { currentIndex = 0; } else { currentIndex++; } currentItem = (ListItem) listModel.get(currentIndex); list.setSelectedIndex(currentIndex); Point p = list.indexToLocation(currentIndex); JScrollBar jScrollBar = listPane.getVerticalScrollBar();// 获得垂直转动条 jScrollBar.setValue(p.y);// 设置垂直转动条位置 btnPlay.setIcon(iconPlay); if (player != null) player.close();
isPause = false; play(); }
public void rand() { list.setSelectedIndex((int)(Math.random()%(listModel.getSize()-1))); Point
p=list.indexToLocation((int)(Math.random()%(listModel.getSize()-1))); JScrollBar jScrollBar = listPane.getVerticalScrollBar(); jScrollBar.setValue(p.y); btnPlay.setIcon(iconPlay); if (player != null) player.close(); isPause = false; play(); }
public void pre() { if (currentIndex == 0) { currentIndex = listModel.getSize() - 1; } else { currentIndex--; } currentItem = (ListItem) listModel.get(currentIndex); list.setSelectedIndex(currentIndex); Point p = list.indexToLocation(currentIndex); JScrollBar jScrollBar = listPane.getVerticalScrollBar();// 获得垂直转动条 jScrollBar.setValue(p.y);// 设置垂直转动条位置 btnPlay.setIcon(iconPlay); if (player != null) { player.close(); } isPause = false; play(); }
// end play control
public DefaultListModel load() { File file = new File(\"list.lst\"); DefaultListModel dlm = new DefaultListModel();
if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(file)); Integer size = (Integer) ois.readObject(); if (size != 0) { for (int i = 0; i < size; i++) { ListItem item = (ListItem) ois.readObject(); dlm.addElement(item); } } ois.close(); return dlm; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return dlm; }
public void save(DefaultListModel dlm) { try { ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(\"list.lst\"))); Integer size = dlm.getSize(); oos.writeObject(size); for (int i = 0; i < size; i++) { ListItem item = (ListItem) dlm.get(i);
oos.writeObject(item); } oos.close(); } catch (Exception e) { e.printStackTrace(); } }
public void controllerUpdate(ControllerEvent e) { if (e instanceof EndOfMediaEvent) { if (mode == 0) {// 顺序播放 System.out.println(\"顺序播放\"); next(); } else if (mode == 1) { // 单曲循环 System.out.println(\"播放结束\"); player.setMediaTime(new Time(0)); System.out.println(\"单曲循环\"); player.start(); } else if (mode == 2) { System.out.println(\"随机播放\"); rand(); } return; } // 当提取媒体的内容结束 if (e instanceof PrefetchCompleteEvent) { System.out.println(\"开始播放\"); player.start(); return; } } }
LISTITEM类
import java.io.Serializable;
public class ListItem implements Serializable {
private static final long serialVersionUID = 1L; private String name; private String path; public ListItem() {}
public ListItem(String name, String path) { this.name = name; this.path = path; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPath() { return path; }
public void setPath(String path) { this.path = path; }
public String toString() { return name; } }
基于java的音乐播放器的设计
摘要:在信息,技术高速发展的今天,多媒体技术也越来越受到人们的重视。文章对目前使用较多的音乐播放器作出较详细的比较。通过阅读多张文献,分析了一些音乐播放器的功能并考虑了怎样能实现支持更多格式的音乐文件,怎样能满足使用者对播放器的需求。本文主要介绍了一个基于Java Applet来实现的音乐播放器的设计。并对系统开发中涉及到的关键技术作了探讨,简要分析介绍了Java技术和 Applet的工作原理,最后说明系统需要实现的功能。 关键词:java;Applet;音乐播放器;
前言
近年来,听音乐已成为人们生活的一部分,与此同时,音乐播放器以其平易近人的价格也日趋普及,这大大丰富了业余生活也缓解了工作压力,但尚有诸多不足之处有待改进日常生活中,我们在听音时,常感手动操作甚是麻烦且想寻找某个音频文件须从头到尾逐个查看,这样费时费力很是不便。音乐播放器的实现方法,采用口述音乐文件名的方式即可播放指定歌曲文件,避免了繁琐的查找,亦使其更加人性化,实现了播放器的全自动语音控制。 我将来要采用java Applet的多媒体技术,设计出一个基于java Applet的音乐播放器。
现在电脑上的音乐播放器百花齐放,以Winamp,Foobar2000,千千静听,酷狗和酷我音乐盒最流行。播放器最重要的参数当属支持的格式了,即使只图个响,也需要有丰富的格式作为后盾。在此方面,千千静听支持多种音频格式,除了常见的MP3,WMA等,也支持APE,FLAC等无损压缩格式,它一共支持三十多种音频格式,是一个比较全能的播放器。Winamp也支持非常多的格式,但对APE格式的支持需要安装对应插件;除音频格式外,Winamp还支持一些常见的视频格式,这个功能能为用户带来一些方便。Foobar2000支持的格式数量也差不多,但是对APE的支持仍然需要安装插件。不过Foobar2000有一个特色功能,它支持直接读取压缩包里的音乐文件,从电骡上下载的APE完整碟通常都是打包的,如果用Foobar2000的这个功能就可以不解压直接听歌了。
相比之下,酷我音乐盒支持的格式就比较单一了,无论是网上搜索还是本地播放歌曲,都仅支持MP3和WMA种格式。酷狗的表现则稍微好点,除了支持MP3和WMA之外,还支持APE和FLAC格式。而酷我音乐盒,则支持在线MV视频的播放。在本文中我利用java语言设计的音乐播放器的功能跟千千静听,酷狗和酷我音乐盒,Winamp,Foobar2000的功能差不多,不过利用java设计的音乐播放器支持的音频文件格式比它们丰富一点。如:WAP,AIFF,MIDI,AU,RMF等跨平台功能比较强。 1 Java 技术
Java技术已经成为当今Internet应用开发的核心与主流技术。这一方面是因为java语言具有面向对象,可移植性,强壮性与安全性等优良特征,另一方面也由于java技术对各个层次的分布式应用(包括电器设备的嵌入式计算,桌面计算与企业级计算)都提供了全面系统的方法与技术。因此,目前java已经从单纯的程序设计语言发展成为支撑Internet计算的 大技术体系,进入了发展与应用的高级阶段。 1.1java语言
对于都数程序设计语言,其程序运行要么采用编译执行,要么采用解释执行的方式。而java语言的特殊之处在于,程序运行既要经过编译又要进行解释,如图1-1所示。首先,java程序由编译器进行编译,产生了一种中间代码,称为java字节码(java bytecodes)。字节码是java虚拟机的代码,是与平台无关的中性代码,因此不能在各种计算机平台上直接运行,必须在JVM上运行。Java解释器是JVM的实现,它把字节码转换为底层平台的机器码,使Java程序最终得以运行。无论是Application还是嵌入式在浏览器中的Applet,都需要通过解释器才能运行。
My Program.java __________________________ ___________________________ 解释器 (Interpreter) 编译器 (Compiler) My Program.class ______________ ___________ ________________ My Program
图1-1 Java 语言的运行 1.2 Java的特征
Java是一种”简单”(simple),面向对象(object oriented),分布式(distributed),解释性(interpreted),健壮(orbust),安全(secure),体系结构中立(architecture neutral),可移植性(portable),高性能(high performance),多线程(multithreaded),和动态(dynamic)“的编程语言。 1)简单性:Java语言语法和语义都比较单纯,,容易学习和使用。
2)面向对象:作为一种面向对象的编程语言,Java不仅最为“纯洁”,同时,它对面向对象方法的支持最为全面。另外,Java通过抽象类和接口(interface)支持面向的多态性要求,既一个对外接口,多种内部实现。
3)分布式特征:Java实现两种层次上的分布。(1)数据分布支持:通过java的URL类,Java程序可以访问网络撒谎那个的各类信息资源。访问方式完全类似于本地文件系统。(2)操作分布支持:java通过嵌在 WWW页面中的Applet(小应用程序)将计算从服务器分布至客户机。Applet由WWW浏览器在客户端执行,从而避免了网络拥挤,提高了系统效率。
4)java的解释性:运行Java程序需要解释器。程序被编译为成为字节代码的Java虚拟机代码。字节代码与机器无关,可以在任何有Java解释器的机器上运行。 5)健壮性:Java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。
6)安全性:在发分布式环境中,安全性是一个十分重要的问题。Java在语言和运行环境中引入了多级安全措施,其采用的主要安全机制有:
(1)内存分配及布局由Java运行系统规定。
(2)运行系统执行基于数字签名技术的代码认证,字节码验证与代码访问权
限控制的。
7)体系结构中立:Java语言的设计不是针对某种具体平台结构的。
8)可移植性:Java是迄今为止对可移植性支持最佳的编程语言。Java的最大特点是“一次编程,处处运行”。 9)高性能:Java语言虽然采取字节码解释运行方式,但由于字节码与机器码十分接近,使得字节码到机器码的转换十分快捷。
10)多线性:线程是比进程更小,更为经济的并发执行单位,它与进程的主要差异在于它不拥有单独的资源,而是与其他线程共享所属进程的资源。 11)动态性:Java的动态性是其面向对象设计的延伸。 2 Java Applet概念
Applet(小应用程序)是Java与Web相结合而引入的一种重要的Java应用形式,它不仅使Web页具有动画,声音,图像和其他特殊效果,更重要的是可以使Web页能够与用户动态进行交互,接收用户的输入,然后根据用户的输入作出不同的反应。它是能够嵌入到HTML页面中,并能够在浏览器中运行的Java类。Applet自身不能运行,必须嵌入在其他应用程序(例如 Web 浏览器或Java Appletviewer)中运行。Applet类提供了从制定的URL获取图像和声音的方法,使Applet可以很方便地 实现多媒体功能。当图像数据通过网络下载时,由于受网络带宽 等因素的,用户在浏览器中看到的一般 是渐渐增长的图像显示过程。获取指定URL上的声音数据,返回一个类型为AudioClip的对象,通过该对象可以实现声音演播。 2.1 Applet 类
生成 Applet要创建Applet类的子类,一个Applet的运行为框架由Applet类来决定的。Applet类提供了从指定的URL获取图像和声音的方法,使Applet可以很方便地实现多媒体功能的。
要编写Applet小应用程序,就必须继承Applet类,并覆盖其中必要的方法。Applet类为applet提供了基本的框架结构是applet和其运行环境之间的标准接口。Web浏览器能够自动调用下列方法来控制applet小应用程序的生成和运行:
1init方法 ○2Start 方法 ○3stop 方法 ○4destroy 方法 ○
3 设计本系统要用到的Java关键技术 3.1在Applet中播放声音的方法和步骤
在Java.Applet包中的Applet类和AudioClip接口提供了播放声音的基本支持。以前计算机存储声音文件的格式有许多,目前Java只支持一种声音文件格式有.au,.mid,.wav等。对于其他格式的文件,可以用相应地工具软件将它们转换为.au或.mid等Java支持的文件。在Applet中播放声音文件有两种方法:
(1)在Java的API中,Applet类提供了一个方法play(),它可以直接根据URL
地址来播放声音。这个方法指定如下:
Public void play(URL url);
Public void play(URL url,string soundFile);
在第一种方法的定义中,参数url是保存声音文件的绝对URL地址,即统一资源定位,它指定Web网上的一个声音文件;在第二种方法定义中,参数URL是保存声音文件的基地址,而参数soundFile是声音文件的文件名。如果声音文件与Applet的HTML文件在相同的目录下,则可以通过使用getCodeBase()方法来获得
该声音文件的基地址。如果Applet本身的URL地址为 “http//www.Tsinghua.edu.cn/pro/”,则语句: Play(gatCodeBase(),“space.au”); 等同于语句:
Play(“http//www.tsinghua.edu.cn/pro/”,“space.au”);
在程序编写过程中,若使用第一种方法定义,则将程序由一个服务器转移到另一服务器上或从一个目录转移到另一个目录下时,必须改变源代码中的URL地址:若使用第二种方法定义,即使用getCodeBase()方法来定位资源文件,则将程序由一个服务器转移到另一个服务器或从一个目录转移到另一个目录下时,不必改变源代码中的URL地址,而只需将声音文件与播放他的Java文件放在同一目录下即可。
Play()方法只能进行简单的播放,只能一次敬爱那个声音文件播放完,没有停止和连续播放的功能,所以,一般编写播放声音的程序时不采用此方法。 (2)利用Java中的AudioClip类对象播放声音文件。AudioClip类提供了两种获取声音数据的方法,定义如下: AudioClip getAudioClip(URL url);
AudioClip getAudioClip(URL url,String soundFile); 它们的参数含义与以上相同。使用时可按如下步骤。 1)声明一个AudioClip类的对象,如: ○
AudioClip audio;
2)使用getAudioClip()方法为AudioClip类的对象获得句柄,如: ○
aud=getAudioClip(getCodeBase(),“space.au”); 或一次完成,如:
AudioClip aud=getAudioClip(getCodeBase(),“space.au”); 或:
AudioClip aud=getAudioClip(“HTTP//www.tsinghua.edu.cn/pro/”,“space.au”
使用这种方法创建声音播放程序文件的一般步骤如下: ○1 创建一个AudioClip对象。 ○2 装入 声音文件到AudioClip对象。 ○3一次播放或者不停地循环播放声音。 ○4停止播放。
Java.applet.AudioClip类提供了3个方法实现对声音文件播放的控制,它们分别是play(),loop()和stop()。在这个设计过程中使用了java.applet.AudioClip类中的play()方法播放一个载入的声音文件;使用loop()方法循环地播放该声音文件,并且使用stop()方法来停止播放这个声音文件。
方法star()和stop()是Applet类中定义的方法,该程序继承了Applet类,并重新定义了这两个方法,这一过程称做方法的覆盖。这两个方法是由操作系统自动调用的。当程序启动时两个方法,star()方法由操作系统自动调用,star()方法在运行时通过AudioClip对象aud调用loop()方法,实现对声音的循环播放。当程序停止运行时,Applet类中的stop()方法被自动调用,stop()方法运行时通过AudioClip对象aud调用AudioClip中的stop()方法来终止声音文件的播放。 3.2创建播放器的图形用户界面所需的控件 3.2.1菜单栏与菜单
在程序中创建菜单是最常用图形的用户界面之一。Java语言中,与菜单相关类有5个:JMenuBar,JMenuItem,JCheckBoxMenuItem和JRadioButtonMenuItem。 实现菜单的过程比较复杂,主要下面三步:
(1)创建菜单栏,并将它设计到某个容器中。创建菜单栏需要利用JMenuBar类,该类只有一个默认构造方法
(2)创建菜单条,并将它们添加到菜单栏中。创建菜单条需要利用JMenu类,该类有多种构造方法,其中最常用的是JMenu(String s)。
(3)创建菜单项,并将它们添加到菜单条中。创建菜单项一般需要利用JMenuItem类,该类有多种构造方法,其中最常用的是JMenuItem(String text)。 3.2.2按钮与标签 1)按钮
创建按钮需要利用JButton类,JButton类中常用的方法有: public JButton() //创建一个没有标记的空按钮
public JButton(Icon icon) //创建一个标有指定图标的按钮 public JButton(String text) //创建一个标有指定文字的按钮 public JButton(String text ,Icon icon) //创建一个标有指定文字和图表的按钮 2)标签
标签与按钮相同,标签也可以显示一串文字或图像。创建标签需要利用JLabel类。JLabel类中常用的构造方法有: public JLabel() //创建一个空标签
public JLabel(Icon image) //创建具有指定图标的标签
public JLabel(Icon image,int horizontalAlignment) //创建具有指定图标和水平对齐方式的标签 public JLabel(String text) //创建具有指定文字的标签
public JLabel(String text,int horizontalAlignment) //创建具有指定文字和水平对齐方式的标签
public JLabel(String text,Icon icon,int horizontalAlignment) //创建具有指定文字,图标和水平对齐方式的标签 3.2.3列表框
列表也允许用户从中进行选择。创建列表需要利用JList类,JList类中常用的构造方法有: public JList()
//创建一个列表,列表中的选项为空 public JList(Object[] listData)
//创建一个列表,列表中的选项由参数listData指定 结论
本文介绍了基于java applet音乐播放器的关键技术。并对Applet的基本原理与设计方法,对Appplet实现的多媒体功能。我将要设计的播放器,使用Swing组件生成播放器的菜单栏,利用JButton类创建按钮,JLabel类创建标签,JList
类创建列表框等方法实现播放器的基本功能。
参考文献:
[1]刘慧宁,那盟.Java程序设计[M].北京:机械工业出版社,2005,10:309-312.
[2]朱喜福,赵敏,夏齐霄,等.java程序设计[M].北京:人民邮电出版社,2005,2:272-290. [3]Y.Daniel Liang 著,马海军,景丽等 译.java编程原理与实践[M].北京:清华大学出版社2005,8:367-3.
[4]徐明浩 著,武转海,译.java编程基础应用与实例[M].北京:人民邮电出版社,2005,10:342-347.
[5] 蔡学镛.java历史回顾[J].WWW.cnki.net,2009,4:53-55.
[6]王祖析.基于java技术的网络教学互动系统的构建[J].学术探讨,2009:74-78. [7]汤庸 主编,冯至圣,申建芳 等.java 程序设计与实践[J].北京:冶金工业出社,2003,1:208-212.
[8] 马义德 ,周炜超 ,文 芳 ,李柏年,李 庚 . 基于SPCE061A 的声控 mp3播放器设计[J]. 电子设计,2009:217-301.
[9] 周华中,李继凯.基于J2ME 流媒体播放器的模型设计[J].科技创新导报,2009:15-18. [10]春水东流. 不让超级旋风自动关联QQ音乐播放器[J]. 电脑迷,2009,(7).
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务