Java多媒体编程应用
1. 声音文件的播放
1.1 在Applet中播放声音
在Applet中,可以使用AudioClip来播放声音,它非常简单,只有三个方法:play()、loop()和stop()。
例1.1 利用AudioClip播放声音文件。
package duomeiti; import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton; public class playMusic extends Applet implements ActionListener {
AudioClip clip = null;
JButton playBtn,loopBtn,stopBtn;
public void init(){
playBtn = new JButton("播放");
loopBtn = new JButton("循环");
stopBtn = new JButton("停止");
playBtn.addActionListener(this);
loopBtn.addActionListener(this);
stopBtn.addActionListener(this);
add(playBtn);
add(loopBtn);
add(stopBtn);
clip = getAudioClip(getCodeBase(),"test.wav");
} public void actionPerformed(ActionEvent e) {
if(e.getSource()==playBtn)
clip.play();
else if(e.getSource()==loopBtn)
clip.loop();
else
clip.stop();
}
}
1.2 在Application中播放声音
它的一般用法是,先用AudioStream创建一个音频流对象,而后将此对象作为参数传递给AudioPlayer.player.start()方法以便播放。虽然AudioPlayer.player中只有start()和stop()两个方法,但是start()方法会从音频流对象上次停止播放的位置开始播放,而不是从头开始播放。所以用stop()暂停一个音频流的播放后,可以使用start()继续播放。
例1.2 在Application中播放声音文件。
package duomeiti; import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import javax.swing.*; import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
public class playAudio implements ActionListener {
protected JTextField fileField;
protected JButton openBtn,startBtn,pauseBtn,resumBtn,stopBtn;
protected Container con;
protected JFrame jf;
protected AudioStream as;
protected FileInputStream fis; public playAudio(){
jf = new JFrame("播放声音");
con = jf.getContentPane();
con.setLayout(new FlowLayout());
fileField = new JTextField();
fileField.setColumns(30);
openBtn = new JButton("选择文件");
startBtn = new JButton("开始播放");
pauseBtn = new JButton("暂停播放");
resumBtn = new JButton("继续播放");
stopBtn = new JButton("停止播放");
openBtn.addActionListener(this);
startBtn.addActionListener(this);
pauseBtn.addActionListener(this);
resumBtn.addActionListener(this);
stopBtn.addActionListener(this);
con.add(fileField);
con.add(openBtn);
con.add(startBtn);
con.add(pauseBtn);
con.add(resumBtn);
con.add(stopBtn);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
Object obj;
obj = e.getSource();
try {
if(obj==openBtn)
openfile();
else if(obj==startBtn){
if(fis!=null) fis.close();
fis = new FileInputStream(fileField.getText());
as = new AudioStream(fis);
AudioPlayer.player.start(as);
}else if(obj==pauseBtn)
AudioPlayer.player.stop(as);
else if(obj==resumBtn)
AudioPlayer.player.start(as);
else if(obj==stopBtn){
AudioPlayer.player.stop(as);
as.close();
fis.close();
fis = null;
}
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(jf, "文件没有找到!");
} catch (IOException e1) {
JOptionPane.showMessageDialog(jf, "无法播放文件!");
}
} private void openfile() {
try {
JFileChooser chooser = new JFileChooser();
if(chooser.showOpenDialog(jf)==JFileChooser.APPROVE_OPTION)
fileField.setText(chooser.getSelectedFile().toString());
} catch (Exception e) {
JOptionPane.showMessageDialog(jf, "无法加载文件!");
}
} public static void main(String[] args) {
new playAudio();
}
}
2. 基本图形处理
2.1 图形的缩放
例2.1 缩放图形示例
package duomeiti;
import java.awt.Color;
import java.awt.Graphics; import javax.swing.*;
public class ResizeOval {
JFrame jf;
MyCanvas palette;
public class MyCanvas extends JPanel{
protected void paintComponent(Graphics g) {
int height,width;
height = getHeight();
width = getWidth();
g.setColor(Color.RED);
g.fillOval(0, 0, width, height);
}
} public ResizeOval(){
jf = new JFrame("图形缩放示例");
palette = new MyCanvas();
jf.getContentPane().add(palette);
jf.setSize(500, 400);
jf.setLocation(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ResizeOval();
}
}
2.2 淡入淡出效果
要实现淡入淡出效果方法非常简单,只要采用HSB(色调-饱和度-亮度)模式设置色彩,其中的色调和亮度不必变化,只要调整饱和度的值即可。如果是淡入,则让饱和度逐步增加;如果是淡出,则让饱和度逐步减少。
例2.2 淡入淡出效果示例。
package duomeiti;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.*;
public class fadeInOut {
JFrame jf;
JPanel jp;
Container con;
dealPushBtn handleBtn;
JButton btn; public class dealPushBtn implements ActionListener{
public void actionPerformed(ActionEvent e) {
Graphics g = jp.getGraphics();
float h = 0.0f;
float s = 0.0f;
float b = 1.0f;
for(int i=0;i<100;i++){
g.setColor(Color.getHSBColor(h, s, b));
g.fillRect(0, 50, 300, 300);
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
s+=0.01;
}
for(int i=0;i<100;i++){
g.setColor(Color.getHSBColor(h, s, b));
g.fillRect(0, 50, 300, 300);
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
s-=0.01;
}
}
} public fadeInOut(){
jf = new JFrame("色彩淡入淡出示例");
jp = new JPanel();
jp.setLayout(new FlowLayout());
handleBtn = new dealPushBtn();
btn= new JButton("开始");
btn.addActionListener(handleBtn);
con = jf.getContentPane();
jp.add(btn);
con.add(jp);
jf.setSize(300, 300);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new fadeInOut(); } }
2.3 透明效果
设置前景色的透明度,可以使得前景色和后景色能够混合起来,这需要使用Graphics2D类。
例2.3 色彩混合效果示例。
package duomeiti;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle; import javax.swing.*;
public class TransparencyExample extends JPanel {
private static int gap=10, width=40, offset=10,deltax=gap+width+offset;
private Rectangle blueSquare = new Rectangle(gap+offset,gap+offset,width,width),
redSquare = new Rectangle(gap,gap,width,width);
//创建一个指定alpha值的AlphaComposite对象
private AlphaComposite makeComposite(float alpha){
int type = AlphaComposite.SRC_OVER;
return (AlphaComposite.getInstance(type, alpha));
}
//用指定的alpha值来绘制前景色
private void drawSquares(Graphics2D g2d,float alpha){
Composite originalComposite = g2d.getComposite();
//用默认透明度绘制背景蓝色
g2d.setPaint(Color.blue);
g2d.fill(blueSquare);
//设置透明度,准备绘制前景红色
g2d.setComposite(makeComposite(alpha));
g2d.setPaint(Color.red);
g2d.fill(redSquare);
//将透明度设置回默认的模式
g2d.setComposite(originalComposite);
}
//分别用不同的透明度来绘制颜色
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
for(int i=0;i<11;i++){
//alpha值逐步增大,透明度逐步减小
drawSquares(g2d,i*0.1F);
g2d.translate(deltax, 0);
}
}
}
package duomeiti;
import javax.swing.*;
import java.awt.*;
public class mixing {
JFrame jf;
TransparencyExample palette;
public mixing(){
jf = new JFrame("色彩混合示例");
palette = new TransparencyExample();
jf.getContentPane().add(palette);
jf.setSize(700, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new mixing();
}
}
3. 字体的处理
3.1 确定可用字体
例3.1 获取系统中安装的字体示例。
package duomeiti;
import java.awt.GraphicsEnvironment; import javax.swing.*;
public class GetFonts {
private JFrame jf;
private JList nameList;
private JScrollPane nameSPane;
public GetFonts(){
jf = new JFrame("获取系统字体");
//获得GraphicsEnvironment类型的对象引用
GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
//获取所有的字体家族名
String[] availableFonts = eq.getAvailableFontFamilyNames();
//存放到列表框中
nameList = new JList(availableFonts);
nameSPane = new JScrollPane(nameList);
jf.add(nameSPane);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new GetFonts();
}
}
3.2 创建字体对象
例3.2 创建和使用字体示例。
package duomeiti;
import javax.swing.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ShowFonts implements ActionListener {
private JFrame jf;
private JComboBox nameBox,styleBox;
private JTextField sizeText;
private JLabel fontLabel;
private JButton showBtn;
private JPanel panel; public ShowFonts(){
jf = new JFrame("显示指定字体");
//显示系统可用字体
GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] availableFonts = eq.getAvailableFontFamilyNames();
nameBox = new JComboBox(availableFonts);
nameBox.setEditable(true);
nameBox.setSelectedItem("宋体");
//显示字体风格由用户选择
String[] style = {"正常","粗体","斜体","粗斜体"};
styleBox = new JComboBox(style);
styleBox.setEditable(false);
//由用户输入想要的字体尺寸
sizeText = new JTextField("12");
sizeText.setColumns(4);
//标签用于显示用户选择的字体
fontLabel = new JLabel("字体示例");
//创建按钮并安装监听器
showBtn = new JButton("显示字体");
showBtn.addActionListener(this);
//在窗口中排列组件
panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(nameBox);
panel.add(styleBox);
panel.add(sizeText);
jf.add(panel, BorderLayout.NORTH);
jf.add(fontLabel, BorderLayout.CENTER);
jf.add(showBtn, BorderLayout.SOUTH);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
//分别获取用户选择输入的字体信息
int styleIndex = styleBox.getSelectedIndex();
String fontStr = (String)nameBox.getSelectedItem();
int fontSize = Integer.parseInt(sizeText.getText());
//组合字体对象
Font userFont = new Font(fontStr,styleIndex,fontSize);
//为标签设置新的字体并显示
fontLabel.setFont(userFont); } public static void main(String[] args) {
new ShowFonts();
}
}
4. 字体的展示处理
例4.1 自行管理字体示例。
package duomeiti;
import javax.swing.*;
import java.awt.*;
public class FontsCanvas extends JPanel {
private String msg;
public FontsCanvas(String s){
msg = s;
setBackground(Color.white);
} public FontsCanvas(){
this("自行管理字体示例");
} public void paintComponent(Graphics g){
int maxWidth = getWidth(); //获取画布的宽度
int showX; //文字输出的横坐标位置
int showY = 0; //文字输出的纵坐标位置
int descent = 0; //文字下半部所占位置
int ascent = 0; //文字上半部所占位置
int leading = 0; //行间距
int totalWidth; //字符串所占宽度
FontMetrics fm; //用于自行管理字体
Font myFonts [] = new Font[4];
//创建不同的字体准备显示
myFonts[0] = new Font("宋体",Font.PLAIN,12);
myFonts[1] = new Font("仿宋",Font.BOLD,24);
myFonts[2] = new Font("黑体",Font.ITALIC,48);
myFonts[3] = new Font("楷体_GB2312",Font.ITALIC|Font.BOLD,60);
//用上述4种不同的字体显示同一个字符串,右对齐
for(int i=0;i<myFonts.length;i++){
g.setFont(myFonts[i]);
fm = g.getFontMetrics();
totalWidth = fm.stringWidth(msg);
showX = maxWidth - totalWidth;
ascent = fm.getMaxAscent();
showY = showY + descent + ascent + leading;
descent = fm.getMaxDescent();
leading = fm.getLeading();
g.drawString(msg, showX, showY);
}
}
}
package duomeiti;
import javax.swing.*;
import java.awt.*;
public class ManageFonts {
private JFrame jf;
private FontsCanvas palette; //可以显示多种文字的画布
public ManageFonts(){
jf = new JFrame("自行管理字体示例");
palette = new FontsCanvas();
jf.add(palette);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public static void main(String[] args) {
new ManageFonts();
}
}
5. 字体的特效显示
例5.1 字体特效显示示例。
package duomeiti; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask; import javax.swing.*;
public class LightingLiteral implements ActionListener {
String title = "光照文字"; //显示的文字
Font myFont = new Font("宋体",Font.BOLD,48); //显示的字体
JPanel palette;
JFrame jf;
JButton startBtn;
Container con;
Timer myTimer;
Refresh task;
boolean startFlag;
public LightingLiteral(){
jf = new JFrame(title);
palette = new JPanel();
startBtn = new JButton("开始");
startFlag = true;
startBtn.addActionListener(this);
con = jf.getContentPane();
con.add(palette, BorderLayout.CENTER);
con.add(startBtn, BorderLayout.NORTH);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
if(startFlag){
myTimer = new Timer();
task = new Refresh();
myTimer.schedule(task, 50, 50); //启动定时器,时间间隔为50毫秒
startBtn.setText("停止");
}else{
myTimer.cancel();
myTimer = null;
task = null;
startBtn.setText("开始");
}
startFlag = !startFlag;
} //用定时器来绘图
class Refresh extends TimerTask{
int pos = 0;
int blink_width = 20; //光条的宽度
Graphics g = palette.getGraphics(); //注意画笔的获取方式
FontMetrics myFM = g.getFontMetrics(myFont);
int height = myFM.getHeight(); //计算文字的高度
int top = myFM.getAscent();
int width = myFM.stringWidth(title);
public Refresh(){
g.setFont(myFont);
}
public void run() {
g.setColor(Color.blue);
g.drawString(title, 0, top); //第一遍显示
g.clipRect(pos, 0, blink_width, height); //设置裁剪区域
g.setColor(Color.yellow);
g.drawString(title, 0, top); //第二遍显示,它只会显示在裁剪区域中
pos = (pos + 5) % width; //移动裁剪区域的位置
g.setClip(null); //让裁剪区域失效,准备重新绘制蓝色文字
}
} public static void main(String[] args) {
new LightingLiteral();
}
}
Java多媒体编程应用的更多相关文章
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
随机推荐
- docker 安装错误Transaction Check Error
安装docker提示:Transaction Check Error: file /usr/bin/docker from install of docker-io-1.7.1-2.el6.x86_6 ...
- Gitlab Issue Tracker and Wiki(一)
本节内容: 创建第一个问题 创建第一个合并请求 接受合并请求 工作里程碑 在提交中引用问题 创建维基百科页 使用Gollum管理维基百科 一. 创建问题 1. 登陆Gitlab服务器 2. 切换到想要 ...
- OSPF详解
OSPF 详解 (1) [此博文包含图片] (2013-02-04 18:02:33) 转载 ▼ 标签: 端的 第二 以太 第一个 正在 目录 序言 初学乍练 循序渐进学习OSPF 朱皓 入门之前 了 ...
- IP、TCP和DNS与HTTP的密切关系
看了上一篇博文的发表时间,是7月22日,现在是10月22日,已经有三个月没写博客了.这三个月里各种忙各种瞎折腾,发生了很多事情,也思考了很多问题.现在这段时间开始闲下来了,同时该思考的事情也思考清楚了 ...
- numpy.base_repr 方法解释
首先看官方文档: numpy.base_repr(number, base=2, padding=0) 将给定的 number 值,换算成给定的 base 进制(默认 2 进制)的值,以字符串的形式返 ...
- annotation中的Autowired
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- java 将class打包成jar包
一.进入到java jdk安装目录(用cmd命令进入) c:cd C:\Program Files\Java\jdk1.8.0_45\bin 二.运行打包命令(将D盘下com中的class 打包成xy ...
- Python并发编程系列之协程
1 引言 协程是近几年并发编程的一个热门话题,与Python多进程.多线程相比,协程在很多方面优势明显.本文从协程的定义和意义出发,结合asyncio模块详细讲述协程的使用. 2 协程的意义 2.1 ...
- 使用DNSPod域名解析
1 在GoDaddy域名注册商 注册域名 https://sg.godaddy.com/zh/ 2 登陆DNSPod https://www.dnspod.cn 3 选择域名解析 添加域名 4 添加记 ...
- iOS 9应用开发教程之ios9中实现按钮的响应
iOS 9应用开发教程之ios9中实现按钮的响应 IOS9实现按钮的响应 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应:另一 ...