• 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();
        }
    }
  • 相关阅读:
    Eclipse报告内存不足和PermSize space错误,Eclipse死掉的解决办法
    jquery插件:文字滚动和google地图位置选择搜索
    CGI、ISAPI和FastCGI三种配置方式
    240多个jQuery插件
    调用外部命令不弹出窗口示例
    将DataSet变化保存到数据源
    Fill()方法和Conn.Open()
    SqlDataAdapter的DeleteCommand属性
    SqlDataAdapter的InsertCommand属性
    使用数据集和XML
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4268458.html
Copyright © 2020-2023  润新知