Java知多少(102)多媒体基础
本节介绍 Java程序播放幻灯片和动画,播放声音和视频的方法。
播放幻灯片和动画
用实例说明播放幻灯片和动画的方法。
【例 12-7】小应用程序先将幻灯片读入数组在存储,单击鼠标变换幻灯片,逐张显示。
import java.applet.*import java.awt.*;
import java.awt.event.*;
public class Example7_7 extends Applet implements MouseListener{
final int number = 50; //假定幻灯片有50张
int count = 0;
Image[] card = new Image[number];
public void init(){
addMouseListener(this);
for (int i = 0; i < number; i++){
card[i] = getImage(getCodeBase(), "DSC0033" + i + ".jpg");
}
}
public void paint(Graphics g){
if ((card[count]) != null)
g.drawImage(card[count], 10, 10, card[count].getWidth(this),card[count].getHeitht(this), this);
}
public void mousePressed(MouseEvent e){
count = (count + 1) % number; //循环逐张显示
repaint();
}
public void mouseRelease(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(Mouse Event e){}
public void mouseClicked(MouseEvent e){}
}
【例 12-8】小应用程序说明播放动画的方法,要求播放的图片和小程序放在相同的目录中,程序通过快速显示一组图片造成显示动画的效果。小应用程序利用线程控制动画图片的逐显示。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Example7_8 extends Applet implements Runnable{
final int number = 50;
int count = 0;
Thread mythread;
Image[] pic = new Image[number];
public void init(){
setSize(300, 200);
for (int i = 0; i <= number; i++){
//载入动画图片
pic[i - 1] = getImage(getCodeBase(), "DSC0033" + i + ".jpg");
}
}
public void start(){
mythread = new Thread(this); //创建一个线程
mythread.start(); //启动线程执行
}
public void stop(){
mythread = null;
}
public void run(){
//线程的执行代码
while (true){
repaint();
count = (count + 1) % number; //改变显示的图片号
try{
mhythread.sleep(200);
}
catch (InterruptedExeception e){}
}
}
public void paint(Graphics g){
if ((pic[count] != null)
g.drawImage(pic[count], 10, 10, pic[count].getwidth(this), pic[count].getHeight(this), this);
}
}
播放声音
Java语言老根据地的音频格式有多种:au、aiff、wav、midi、rfm等。小程序要播放音频文件,可使用类AudioClip,该类在java.applet.AudioClip类库中定义。小程序先创建AudioClip对象,并用getAudioClip()方法为其初始化。代码形式如下:
AudioClip audioClip = getAudioClip(getCodeBase(),”myAudioClipFile.au”);
如果要从网上获得音频文件,可用方法getAudioClip(URL url, String name),根据url地址及音频文件name获得可播放的音频对象。
控制声音的播放有3个方法:play()播放声音,loop()循环播放和stop()停止播放。
【例 12-9】能播放声音的小应用程序。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Example7_9 extends Applet implements ActionListener{
AudioClip clip; //声明一个音频对象
Button buttonPlay, buttonLoop, buttonStop;
public void init(){
clip = getAudioClip(getCodeBase(), "2.wav");
//根据程序所在地址处声音文件2.wav创建音频对象,
//Applet类的getCodeBase()方法可以获得小程序所在的html页面的URL地址。
buttonPlay = new Button("开始播放");
buttonLoop = new Button("循环播放");
buttonStop = new Button("停止播放");
buttonPlay.addActionListener(this);
buttonStop.addActionListener(this);
buttonLoop.addActionListener(this);
add(buttonPlay);
add(buttonLoop);
add(buttonStop);
}
public void stop(){
clip.stop(); //当离开此页面时停止播放
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == buttonPlay){
clip.play();
}
else if (e.getSource() == buttonLoob){
clip.loop();
}
else if (e.getSource() == buttonStop){
clip.stop();
}
}
}
【例 12-10】如果声音文件较大或网络速度慢会影响小程序的初始化工作。这可用多线程技术解决。在一个级别较低的线程中完成音频对象的创建,即由后台载入声音文件,前台播放。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Hanoi extends applet implements Runnable, ActionListener{
AudioClip clip; //声明一个音频对象
textField text;
Thread thread;
Button buttonPlay, buttonLoop, buttonStop;
public void init(){
thread = new Thread(this); //创建新线程
thread .setPriority(Thread.MIN_PRIORITY);
buttonPlay = new Button("开始播放");
buttonLoop = new Button( "循环播放");
buttonStop = new Button("停止播放");
text = new textField(12);
buttonPlay.addActionListener(this);
buttonStop.addActionListener(this);
buttonLoop.addActionListener(this);
add(buttonPlay);
add(buttonLoop);
add(buttonStop);
add(text);
}
public void start(){
thread.start();
}
public void stop(){
clip.stop();
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == buttonPlay(){
clip.play();
}
else if (e.getSource() == buttonLoop(){
clip.loop();
}
else if (e.getSource() == buttonStop(){
clip.stop();
}
}
public void run(){
//在线程thread 中创建音频对象
clip = getAudioclip(getCodeBase(), "2.wav");
text.setText("请稍等");
if(clip ! = null){
buttonPlay.setBackground(Color.red); buttonLoop.setBackground(Color.green); text.setText("您可以播放了");
} //获得音频对象后通知可以播放
}
}
系列文章:
Java知多少(102)多媒体基础的更多相关文章
- Java知多少(74)基础类库
Java 的类库是 Java 语言提供的已经实现的标准类的集合,是 Java 编程的 API(Application Program Interface),它可以帮助开发者方便.快捷地开发 Java ...
- Java知多少(81)框架窗口基础
窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这 ...
- Java知多少(83)面板基础:JPanel和JScrollPane
面板有两种,一种是普通面板(JPanel),另一种是滚动面板(JScrollPane). JPanel 面板是一种通用容器,JPanel的作用是实现界面的层次结构,在它上面放入一些组件,也可以在上面绘 ...
- Java知多少(95)绘图基础
要在平面上显示文字和绘图,首先要确定一个平面坐标系.Java语言约定,显示屏上一个长方形区域为程序绘图区域,坐标原点(0,0)位于整个区域的左上角.一个坐标点(x,y)对应屏幕窗口中的一个像素,是整数 ...
- Java知多少(100)图像处理基础
图像是由一组像素构成,用二进制形式保存的图片.java语言支持GIF.JPEG和BMP这3种主要图像文件格式.java语言的图像处理功能被封装在Image类中. 图像载入和输出 在java程序中,图像 ...
- Java知多少(43)异常处理基础
Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...
- Java知多少(完结篇)
Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java ...
- Java知多少(下)
Java知多少(78)Java向量(Vector)及其应用 Java知多少(79)哈希表及其应用 Java知多少(80)图形界面设计基础 Java知多少(81)框架窗口基础 Java知多少(82)标签 ...
- Java知多少(112)数据库之删除记录
删除数据表也有3种方案 一.使用Statement对象 删除数据表记录的SQL语句的语法是: delete from 表名 where 特定条件 例如 : delete from ksInfo whe ...
随机推荐
- [清橙A1210]光棱坦克
[清橙A1210]光棱坦克 题目大意: 平面上放置了\(n(n\le7000)\)个反射装置,光纤将从某个装置出发,在经过一处装置时发生反射,若经过的装置坐标依次为\((x_1,y_1),(x_2,y ...
- phpstorm在项目中查找某个字符串
如果项目过大,想在整个项目中找某个字符串,又不知道该字符串所在文件的路径,这时候就可以使用全局搜索了,ctrl+shift+F.在mac下,快捷键是command+shift+F:
- 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...
- 小学生四则运算出题软件-基于java控制台的实现
.题目描述: 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和 ...
- Redis集群官方推荐方案 Redis-Cluster
Redis-Cluster redis使用中遇到的瓶颈 我们日常在对于redis的使用中,经常会遇到一些问题 1.高可用问题,如何保证redis的持续高可用性. 2.容量问题,单实例redis内存无法 ...
- C#高级编程9-第13章 异步编程
异步编程 1)异步编程的重要性 在C#5.0中提供了关键字:async和await 使用异步编程后台运行方法调用,程序的运行过程中就不会一直处于等待中.便于用户继续操作. 异步编程有3种模式:异步模式 ...
- Revit API创建标注NewTag
start ; ) { eId = item; } ...
- ASP.NET Web API实现缓存的2种方式
在ASP.NET Web API中实现缓存大致有2种思路.一种是通过ETag, 一种是通过类似ASP.NET MVC中的OutputCache. 通过ETag实现缓存 首先安装cachecow.ser ...
- [Java] 简化正则表达式的使用
使用 RegexString.with(string).pattern(pattern).start() + 后续操作(matches,find或者是replace) 源码 package com; ...
- 利用ConcurrentHashMap来实现一个ConcurrentHashSet
利用ConcurrentHashMap来实现一个ConcurrentHashSet package hashset; import java.io.Serializable; import java. ...