1. 声音文件的播放
1.1 在Applet中播放声音
在Applet中,可以使用AudioClip来播放声音,它非常简单,只有三个方法:play()、loop()和stop()。
例1.1 利用AudioClip播放声音文件。
packageduomeiti;importjava.applet.Applet;importjava.applet.AudioClip;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;public class playMusic extends Applet implementsActionListener {
AudioClip clip= null;
JButton playBtn,loopBtn,stopBtn;public voidinit(){
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 voidactionPerformed(ActionEvent e) {if(e.getSource()==playBtn)
clip.play();else if(e.getSource()==loopBtn)
clip.loop();elseclip.stop();
}
}
1.2 在Application中播放声音
它的一般用法是,先用AudioStream创建一个音频流对象,而后将此对象作为参数传递给AudioPlayer.player.start()方法以便播放。虽然AudioPlayer.player中只有start()和stop()两个方法,但是start()方法会从音频流对象上次停止播放的位置开始播放,而不是从头开始播放。所以用stop()暂停一个音频流的播放后,可以使用start()继续播放。
例1.2 在Application中播放声音文件。
packageduomeiti;importjava.awt.Container;importjava.awt.FlowLayout;importjava.awt.HeadlessException;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;import javax.swing.*;importsun.audio.AudioPlayer;importsun.audio.AudioStream;public class playAudio implementsActionListener {protectedJTextField fileField;protectedJButton openBtn,startBtn,pauseBtn,resumBtn,stopBtn;protectedContainer con;protectedJFrame jf;protectedAudioStream as;protectedFileInputStream fis;publicplayAudio(){
jf= new JFrame("播放声音");
con=jf.getContentPane();
con.setLayout(newFlowLayout());
fileField= newJTextField();
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 voidactionPerformed(ActionEvent e) {
Object obj;
obj=e.getSource();try{if(obj==openBtn)
openfile();else if(obj==startBtn){if(fis!=null) fis.close();
fis= newFileInputStream(fileField.getText());
as= newAudioStream(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 voidopenfile() {try{
JFileChooser chooser= newJFileChooser();if(chooser.showOpenDialog(jf)==JFileChooser.APPROVE_OPTION)
fileField.setText(chooser.getSelectedFile().toString());
}catch(Exception e) {
JOptionPane.showMessageDialog(jf,"无法加载文件!");
}
}public static voidmain(String[] args) {newplayAudio();
}
}
2. 基本图形处理
2.1 图形的缩放
例2.1 缩放图形示例
packageduomeiti;importjava.awt.Color;importjava.awt.Graphics;import javax.swing.*;public classResizeOval {
JFrame jf;
MyCanvas palette;public class MyCanvas extendsJPanel{protected voidpaintComponent(Graphics g) {intheight,width;
height=getHeight();
width=getWidth();
g.setColor(Color.RED);
g.fillOval(0, 0, width, height);
}
}publicResizeOval(){
jf= new JFrame("图形缩放示例");
palette= newMyCanvas();
jf.getContentPane().add(palette);
jf.setSize(500, 400);
jf.setLocation(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}public static voidmain(String[] args) {newResizeOval();
}
}
2.2 淡入淡出效果
要实现淡入淡出效果方法非常简单,只要采用HSB(色调-饱和度-亮度)模式设置色彩,其中的色调和亮度不必变化,只要调整饱和度的值即可。如果是淡入,则让饱和度逐步增加;如果是淡出,则让饱和度逐步减少。
例2.2 淡入淡出效果示例。
packageduomeiti;importjava.awt.Color;importjava.awt.Container;importjava.awt.FlowLayout;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;import javax.swing.*;public classfadeInOut {
JFrame jf;
JPanel jp;
Container con;
dealPushBtn handleBtn;
JButton btn;public class dealPushBtn implementsActionListener{public voidactionPerformed(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;
}
}
}publicfadeInOut(){
jf= new JFrame("色彩淡入淡出示例");
jp= newJPanel();
jp.setLayout(newFlowLayout());
handleBtn= newdealPushBtn();
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 voidmain(String[] args) {newfadeInOut();
}
}
2.3 透明效果
设置前景色的透明度,可以使得前景色和后景色能够混合起来,这需要使用Graphics2D类。
例2.3 色彩混合效果示例。
packageduomeiti;importjava.awt.AlphaComposite;importjava.awt.Color;importjava.awt.Composite;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Rectangle;import javax.swing.*;public class TransparencyExample extendsJPanel {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= newRectangle(gap,gap,width,width);//创建一个指定alpha值的AlphaComposite对象
private AlphaComposite makeComposite(floatalpha){int type =AlphaComposite.SRC_OVER;return(AlphaComposite.getInstance(type, alpha));
}//用指定的alpha值来绘制前景色
private void drawSquares(Graphics2D g2d,floatalpha){
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 voidpaintComponent(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);
}
}
}
packageduomeiti;import javax.swing.*;import java.awt.*;public classmixing {
JFrame jf;
TransparencyExample palette;publicmixing(){
jf= new JFrame("色彩混合示例");
palette= newTransparencyExample();
jf.getContentPane().add(palette);
jf.setSize(700, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}public static voidmain(String[] args) {newmixing();
}
}
3. 字体的处理
3.1 确定可用字体
例3.1 获取系统中安装的字体示例。
packageduomeiti;importjava.awt.GraphicsEnvironment;import javax.swing.*;public classGetFonts {privateJFrame jf;privateJList nameList;privateJScrollPane nameSPane;publicGetFonts(){
jf= new JFrame("获取系统字体");//获得GraphicsEnvironment类型的对象引用
GraphicsEnvironment eq =GraphicsEnvironment.getLocalGraphicsEnvironment();//获取所有的字体家族名
String[] availableFonts =eq.getAvailableFontFamilyNames();//存放到列表框中
nameList = newJList(availableFonts);
nameSPane= newJScrollPane(nameList);
jf.add(nameSPane);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}public static voidmain(String[] args) {newGetFonts();
}
}
3.2 创建字体对象
例3.2 创建和使用字体示例。
packageduomeiti;import javax.swing.*;import java.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;public class ShowFonts implementsActionListener {privateJFrame jf;privateJComboBox nameBox,styleBox;privateJTextField sizeText;privateJLabel fontLabel;privateJButton showBtn;privateJPanel panel;publicShowFonts(){
jf= new JFrame("显示指定字体");//显示系统可用字体
GraphicsEnvironment eq =GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] availableFonts=eq.getAvailableFontFamilyNames();
nameBox= newJComboBox(availableFonts);
nameBox.setEditable(true);
nameBox.setSelectedItem("宋体");//显示字体风格由用户选择
String[] style = {"正常","粗体","斜体","粗斜体"};
styleBox= newJComboBox(style);
styleBox.setEditable(false);//由用户输入想要的字体尺寸
sizeText = new JTextField("12");
sizeText.setColumns(4);//标签用于显示用户选择的字体
fontLabel = new JLabel("字体示例");//创建按钮并安装监听器
showBtn = new JButton("显示字体");
showBtn.addActionListener(this);//在窗口中排列组件
panel = newJPanel();
panel.setLayout(newFlowLayout());
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 voidactionPerformed(ActionEvent e) {//分别获取用户选择输入的字体信息
int styleIndex =styleBox.getSelectedIndex();
String fontStr=(String)nameBox.getSelectedItem();int fontSize =Integer.parseInt(sizeText.getText());//组合字体对象
Font userFont = newFont(fontStr,styleIndex,fontSize);//为标签设置新的字体并显示
fontLabel.setFont(userFont);
}public static voidmain(String[] args) {newShowFonts();
}
}
4. 字体的展示处理
例4.1 自行管理字体示例。
packageduomeiti;import javax.swing.*;import java.awt.*;public class FontsCanvas extendsJPanel {privateString msg;publicFontsCanvas(String s){
msg=s;
setBackground(Color.white);
}publicFontsCanvas(){this("自行管理字体示例");
}public voidpaintComponent(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
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);
}
}
}
packageduomeiti;import javax.swing.*;import java.awt.*;public classManageFonts {privateJFrame jf;private FontsCanvas palette; //可以显示多种文字的画布
publicManageFonts(){
jf= new JFrame("自行管理字体示例");
palette= newFontsCanvas();
jf.add(palette);
jf.setSize(500, 400);
jf.setLocation(300, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}public static voidmain(String[] args) {newManageFonts();
}
}
5. 字体的特效显示
例5.1 字体特效显示示例。
packageduomeiti;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Container;importjava.awt.Font;importjava.awt.FontMetrics;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Timer;importjava.util.TimerTask;import javax.swing.*;public class LightingLiteral implementsActionListener {
String title= "光照文字"; //显示的文字
Font myFont = new Font("宋体",Font.BOLD,48); //显示的字体
JPanel palette;
JFrame jf;
JButton startBtn;
Container con;
Timer myTimer;
Refresh task;booleanstartFlag;publicLightingLiteral(){
jf= newJFrame(title);
palette= newJPanel();
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 voidactionPerformed(ActionEvent e) {if(startFlag){
myTimer= newTimer();
task= newRefresh();
myTimer.schedule(task,50, 50); //启动定时器,时间间隔为50毫秒
startBtn.setText("停止");
}else{
myTimer.cancel();
myTimer= null;
task= null;
startBtn.setText("开始");
}
startFlag= !startFlag;
}//用定时器来绘图
class Refresh extendsTimerTask{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);publicRefresh(){
g.setFont(myFont);
}public voidrun() {
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 voidmain(String[] args) {newLightingLiteral();
}
}