Java中实现播放声音

Java中实现播放声音,第1张

java不支持播放mp3格式的声间文件,你把它转成au格式的就能播放了

可以看看下面:

Java对多媒体的支持

4.2 图像与声音

其它语言相比较,如果说Java对图形和文本媒体的支持并不占明显优势的话,那么Java对图像与声音媒体的支持真可谓是技高一筹,显示图像与播放声音就如同显示一行文本一样方便。同时,正由于在Java动画中灵活的运用图像和声音媒体,才使得Web页面更具魅力。

4.2.1 图像文件的显示

正如上一节所介绍的,Graphics类中确实提供了不少绘制图形的方法,但如果用它们在applet运行过程中实时地绘制一幅较复杂的图形(例如一条活泼可爱的小狗),就好比是在用斧头和木块去制造航天飞机。因此,对于复杂图形,大部分都事先用专用的绘图软件绘制好,或者是用其它截取图像的工具(如扫描仪、视效卡等)获取图像的数据信息,再将它们按一定的格式存入图像文件。applet运行时,只要找到图像文件存贮的位置,将它装载到内存里,然后在适当的时机将它显示在屏幕上就可以了。

1.图像文件的装载

Java目前所支持的图像文件格式只有两种,它们分别是GIF和JPEG格式(带有.GIF、.JPG、.JPEG后缀名的文件)。因此若是其它格式的图像文件,就先要将它们转换为这两种格式。能转换图像格式的软件有很多,如PhotoStyler等。

Applet类中提供了getImage( )方法用来将准备好的图像文件装载到applet中,但我们必须首先指明图像文件所存贮的位置。由于Java语言是面向网络应用的,因此文件的存贮位置并不局限于本地机器的磁盘目录,而大部分情况是直接存取网络中Web服务器上的图像文件,因而,Java采用URL(Universal Resource Location,统一资源定位器)来定位图像文件的网络位置。因此,Java专门提供了URL类来管理URL信息(关于该类的详细介绍见下一章)。

表示一个URL信息可分为两种形式:

一种称为绝对URL形式,它指明了网络资源的全路径名。如:

绝对URL:“http://www.xyz.com/java/imgsample/images/m1.gif”

另一种称为相对URL形式,分别由基准URL(即base URL)再加上相对于基准URL下的相对URL这两部分组成,例如上面的例子可表示为:

基准URL:“http://www.xyz.com/java/imgsample/”

相对URL:“images/m1.gif”

现在,我们可以来看一下getImage( )方法的调用格式了:

Image getImage(URL url)

Image getImage(URL url, String name)

我们可以发现,这两种调用格式的返回值都是Image对象。确实,Java特别提供了java.awt.Image类来管理与图像文件有关的信息,因此执行与图像文件有关的 *** 作时不要忘了import这个类。getImage( )方法的第一种调用格式只需一个URL对象作为参数,这便是绝对URL。而后一种格式则带有两个参数,第一个参数给出的URL对象是基准URL,第二个参数是字符串类型,它描述了相对于基准URL下的路径和文件名信息,因此这两个参数的内容综合在一起就构成了一个绝对URL。例如,下面两种写法所返回的结果是一样的:

Image img=getImage(new URL("http://www.xyz.com/java/imgsample/images/m1.gif")

Image img=getImage(new URL("http://www.xyz.com/java/imgsample/"),"images/m1.gif")

表面看来,好象第一种调用格式较方便一些,但实际上第二种调用格式用得更普遍,因为这种格式更具灵活性。原来,Applet类中提供了两个方法来帮助我们方便地获取基准URL对象,它们的调用格式如下:

URL getDocumentBase( )

URL getCodeBase( )

其中getDocumentBase( )方法返回的基准URL对象代表了包含该applet的HTML文件所处的目录,例如该文件贮存在“http://www.xyz.com/java/imgsample/m1.html”中,则该方法就返回“http://www.xyz.com/java/imgsample/”路径。而getCodeBase( )方法返回的基准URL对象代表了该applet文件(.class文件)所处的目录。它是根据HTML文件的"APPLET"标记中的CODEBASE属性值计算出来的,若该属性没有设置,则同样返回该HTML文件所处的目录。

好了,现在我们应该可以感受到基准URL的灵活性了吧。只要我们写下语句:

Image img = getImage(getDocumentBase( ),"images/m1.gif")

那么即使整个imgsample目录移到别处任何地方,也可以正确装载图像文件,而采用对于绝对URL形式则需要重新修改applet代码并重新编译。

2. 图像文件的显示

getImage( )方法仅仅是将图像文件从网络上装载进来,交由Image对象管理。那我们样把得到的Image对象中的图像显示在屏幕上呢?这又要回到我们的老朋友Graphics类来了,因为Graphics类提供了一个drawImage( )方法,它能完成将Image对象中的图像示在屏幕的特定位置上,就象显示文本一样方便。drawImage( )方法的调用格式如下:

boolean drawImage(Image img, int x, int y, ImageObserver observer)

其中img参数就是要显示的Image对象。x和y参数是该图像左上角的坐标值。observer参数则是一个ImageObserver接口(interface),它用来跟踪图像文件装载是否已经完成的情况,通常我们都将该参数置为this,即传递本对象的引用去实现这个接口。

除了将图像文件照原样输出以外,drawImage( )方法的另外一种调用格式还能指定图像显示的区域大小:

boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)

这种格式比第一种格式多了两个参数width和height,即表示图像显示的宽度和高度。若实际图像的宽度和高度与这两个参数值不一样时,Java系统会自动将它进行缩放,以适合我们所定的矩形区域。

有时,我们为了不使图像因缩放而变形失真,可以将原图的宽和高均按相同的比例进行缩小或放大。那么怎样知道原图的大小呢?只需调用Image类中的两个方法就可以分别得到原图的宽度和高度。它们的调用格式如下:

int getWidth(ImageObserver observer)

int getHeight(ImageObserver observer)

同drawImage( )方法一样,我们通常用this作为observer的参数值。

下面的程序段给出了一个显示图像文件的例子,其显示结果如图4-14所示。

import java.awt.Graphics

import java.awt.Image

public class Images extends java.applet.Applet{

Image img

public void init(){

img=getImage(getCodeBase(),"man.gif")

}

public void paint(Graphics g){

int w=img.getWidth(this)

int h=img.getHeight(this)

g.drawImage(img,20,10,this)//原图

g.drawImage(img,200,10,w/2,h/2,this)//缩小一半

g.drawImage(img,20,200,w*2,h/3,this)//宽扁图

g.drawImage(img,350,10,w/2,h*2,this)//瘦高图

}

}

图4-14 显示图像文件

4.2.2 声音文件的播放

对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美的享受,那才叫过瘾。Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了。

Java目前支持的声音文件只有一种格式,那就是SUN公司的AU格式(.AU文件),也称为u-law格式。由于AU格式的声音仅有8KHz的采样频率且不支持立体声效果,所以音质不算太好。唯一的好处就是AU声音文件的尺寸比其它格式小,有利于网上传输。一般,我们较熟悉的大都是WAV格式的声音文件,因此必须先将它们转换为AU格式(可以选用Goldwave软件来进行这种格式转换)。

声音文件准备好以后,就可以考虑将它装载进来并播放。在Applet类中提供的play( )方法可以将声音文件的装载与播放一并完成,其调用格式如下:

void play(URL url)

void play(URL url, String name)

可见,play( )方法的调用格式与getImage( )方法是完全一样的,也采用URL来定位声音文件。例如,某声音文件audio.au与applet文件存放在同一目录下,可以这样写:

play(getCodeBase( ),"audio.au")

一旦play( )方法装载了该声音文件,就立即播放。如果找不到指定URL下的声音文件,play( )方法不返回出错信息,只是听不到想听的声音而已。

由于play( )方法只能将声音播放一遍,若想循环播放某声音作为背景音乐,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放 *** 作。因为它被定义在java.applet程序包中,所以使用该类的话,不要忘了在程序头部加上:

import java.applet.AudioClip

为了得到AudioClip对象,我们可以调用Applet类中的getAudioClip( )方法。它能装载指定URL的声音文件,并返回一个AudioClip对象,其调用格式如下:

AudioClip getAudioClip(URL url)

AudioClip getAudioClip(URL url, String name)

得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来 *** 作其中的声音数据,这些方法如表4-4所示。

如果getAudioClip( )方法没有找到所指定的声音文件,就会返回null值。所以,在调用表4-4中所列的方法前,应该先检查一下得到的AudioClip对象不是null,因为在null对象上调用上述方法将导致出错。

如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就象二重奏一样。另外还有一点要说明的是,如果我们使用AudioClip对象的loop( )方法来重复播放背景音乐时,千万不要忘记在适当的时候调用AudioClip对象的stop( )方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止,这无疑将会惹恼用户。因此,一般我们都在applet的stop( )方法中添上停止播放的代码。

例如,下面这段程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音。

import java.applet.AudioClip

public class Audios extends java.applet.Applet{

AudioClip bgmusic,speak

public void init(){

bgmusic=getAudioClip(getDocumentBase(),"space.au")

speak=getAudioClip(getDocumentBase(),"intro.au")

}

public void start(){

if(bgmusic!=null)

bgmusic.loop()

if(speak!=null)

speak.play()

}

public void stop(){

if(bgmusic!=null)

bgmusic.stop()//关闭背景音乐,切记。

}

}

使用方法:

JPanel可以为添加到窗体中的轻型控件提供通用的容器。默认情况下,面板容器不会向控件添加任何除自身背景之外的颜色,但是,可以轻松地向其添加边框(borders)并根据需要改制样式。

在大多数Java GUI外观体验(look and feel)中,面板容器默认是不透明。不透明的面板容器跟普通的目录窗格功能差别不大,并且可以有效帮助样式改进。

设置图层管理器

和其他容器(container)一样,面板容器panel也使用布局管理器(Layout Manager)对添加到容器中的组件(compnent)进行定位和设置尺寸大小。

默认情况下,面板容器的布局管理器是FlowLayout(流式布局)类的一个实例,这个类对放置在容器中的空间按行进行布局(从左到右诸行排列)。在创建面板容器时,你可以轻松地使用任何其他

布局管理器通过调用setLayout方法或指定一个布局管理器。

如下是一个在创建面板容器时设置图层管理器的例子:

JPanel p=new JPanel(new BorderLayout())

但这种方法不能用在BoxLayout(盒子布局)中,因为BoxLayout构造器需要一个预留(pre-existing)容器。如下所示:

JPanel p=new JPanel()

p.setLayout(new BoxLayout(p,BoxLayout.PAGE_AXIS))

添加控件

向面板容器中添加组件时使用add()方法,而向add()方法中传递的参数决定于该面板容器使用哪个布局管理器。当所用的布局管理器是FlowLayout,BoxLayout,GridLayout,或SpringLayout时,像通常那样向add()方法传递单一的参数即可,如下所示:

aFlowPanel.add(aComponent)

aFlowPanel.add(anotherComponent)

而当布局管理器为BorderLayout时,还需要提供另一个参数来指定添加到容器中控件的位置,例如:

aBorderPanel.add(aComponent,BorderLayout.CENTER)

aBorderPanel.add(anotherComponent,BorderLayout.PAGE_END)

对于GridBagLayout布局管理器,可以使用上述任一方法,但必须以某种方式对每个组件指定GridBagConstraints,例如:

JPanel pane=new JPanel(new GridBagLayout())

GridBagConstraints c=new GridBagConstraints()

警告

Swing不是线程安全的。

此类的序列化对象与以后的Swing版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同Swing版本的应用程序之间进行RMI(Remote Method Invocation,远程方法调用)。

扩展资料:

JPanel一个面板也是一个容器JPanel Pan=new JPanel()

Pan.setLayout(null)//设置为空布局也就是自由布局

Pan.add(控件)//添加控件

JPanel是java图形化界面中最常使用的容器。实例:在窗体中添加一个蓝色的面板

//PanelDemo.java

import javax.swing.*

import java.awt.*//引入AWT包,因为要使用到颜色类

class PanelDemo{

public static void main(String[]args)throws Exception

{JFrame f=new JFrame("第一个Java窗口")

f.setSize(300,200)

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

f.setVisible(true)

f.setResizable(false)

f.setLocationRelativeTo(null)

f.setLayout(null)//设置窗体布局为空布局

JPanel p=new JPanel()//实例化一个面板

//设置面板背景色为蓝色,如果不引入AWT包,程序将出错,可以试试看

p.setBackground(Color.BLUE)

p.setSize(100,100)//设置面板对象大小

f.getContentPane().add(p)//将面板添加到窗体中

//如果使用下面添加面板的方法,面板将布满整个窗口,可以试试看

//f.setContentPane(p)

}

}

参考资料:

百度百科——JPanel


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11221756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存