基于JMF 媒体文件播放

import javax.media.*;
import java.awt.*;
import java.awt.event.*;

//为MediaPlayer对象分配内存
class MediaPlayer extends Frame implements ActionListener,
        ControllerListener, ItemListener {
    Player player;
    Component vc, cc;
    boolean first = true, loop = false;
    String currentDirectory;


    MediaPlayer(String title) {
        super(title); //设置窗口的标题
        addWindowListener
                (new WindowAdapter() {
            //注册窗口监听事件,已处理窗口关闭事件
            public void windowClosing(WindowEvent e) {
                // 用户点击窗口系统菜单的关闭按钮
                // 调用dispose以执行windowClosed
                dispose();
            }

            public void windowClosed(WindowEvent e)

            {
                if (player != null) {
                    player.close();
                }
                System.exit(0);
            }
        });

        Menu m = new Menu("文件"); //创建“文件”菜单

        MenuItem mi = new MenuItem("打开"); //创建“打开”菜单

        //把MediaPlayer对象注册成为“打开”菜单项动作事件的监听器
        mi.addActionListener(this);
        m.add(mi); //把“打开”菜单加入到“文件”菜单
        m.addSeparator(); //在“文件”菜单中加入一条水平分割线
        //创建带检查框的“循环”菜单项
        CheckboxMenuItem cbmi = new CheckboxMenuItem("循环", false);
        cbmi.addItemListener(this); //把MediaPlayer对象注册为循环菜单事件的监听器
        m.add(cbmi); //把“循环”菜单 项加入“文件菜单”
        m.addSeparator(); //分割线
        mi = new MenuItem("退出");
        mi.addActionListener(this);
        m.add(mi);

        //创建一个菜单条
        MenuBar mb = new MenuBar();
        mb.add(m); //把“文件”菜单加入到菜单条
        setMenuBar(mb); //把信建的菜单菜单条设置为窗口的菜单条

        setSize(200, 200); //窗口的大小
        setVisible(true); //显示主窗口
    }


    //动作监听器
//当初现动作时
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("退出")) { //如果动作事件起源于“退出”菜单项
            // 调用dispose以便执行windowClosed
            dispose(); //触发一个给窗口监听的窗口关闭事件
            return; //返回
        }

        //创建一个“打开媒体文件”对话框
        FileDialog fd = new FileDialog(this, "打开媒体文件",
                                       FileDialog.LOAD);
        //把对话框的当前目录设置为上次关闭时的目录
        fd.setDirectory(currentDirectory);
        fd.show(); //显示对话框,这个对话框是一个模式对话框
        // 如果用户放弃选择文件,则返回
        if (fd.getFile() == null) {
            return;
        }

        //保存用户在对话框中选择媒体文件
        currentDirectory = fd.getDirectory();
        //如果以前已经创建 JMF 播放器对象则关闭对象
        if (player != null) {
            player.close();
        }

        try {
            //根据指定的目录和名字,创建一个file:协议的媒体定位器(MediaLocator)对象
            //利用该对象创建一个假冒JMF 播放器
            player = Manager.createPlayer(new MediaLocator("file:" +
                    fd.getDirectory()
                    + fd.getFile()));
        } catch (java.io.IOException e2) {
            System.out.println(e2);
            return;
        } catch (NoPlayerException e2) {
            System.out.println("不能找到播放器.");
            return;
        }

        if (player == null) {
            System.out.println("无法创建播放器.");
            return;
        }
        first = false;
        //把主窗口的标题设置为媒体文件的名字
        setTitle(fd.getFile());
        //把MediaPlayer对象注册为来自 JMF 播放器对象的控制器事件的监听器
        player.addControllerListener(this);
        //让JMF播放器对象预先提取媒体内容
        player.prefetch();

        //此处好像缺 return
        return;
    }


    //控制监听事器
    public void controllerUpdate(ControllerEvent e) {
        //当控制器被关闭
        // 调用player.close()时ControllerClosedEvent事件出现。
        // 如果存在视觉部件,则该部件应该拆除(为一致起见,
        // 我们对控制面板部件也执行同样的操作)
        if (e instanceof ControllerClosedEvent) {
            if (vc != null) {
                remove(vc);
                vc = null;
            }
            if (cc != null) {
                remove(cc);
                cc = null;
            }
            return;
        }

        //当媒体回放结束
        if (e instanceof EndOfMediaEvent) {
            //如果“循环”菜单被选中
            if (loop) {
                //复位开始时间
                player.setMediaTime(new Time(0));
                player.start(); //让JMF播放器对象开始播放媒体
            }
            return;
        }

        //当预提取媒体内容结束
        if (e instanceof PrefetchCompleteEvent) {
            player.start(); //JMF播放器对象开始播放媒体
            return;
        }

        //当实例化(realize)完成
        if (e instanceof RealizeCompleteEvent) {
            //获取JMF播放器对象的控制面板部件
            vc = player.getVisualComponent();
            //如果控制部件存在,则把它加入到MedaPlayer容器的南方
            if (vc != null) {
                add(vc);
            }
            cc = player.getControlPanelComponent();
            if (cc != null) {
                add(cc, BorderLayout.SOUTH);
            }
            pack(); //执行pack()操作

            //此处好像缺 return
            return;
        }
    }

    //菜单项监听器
    //当菜单项状态改变
    public void itemStateChanged(ItemEvent e) {
        loop = !loop; //切换“循环”菜单被选中的状态

        //此处好像缺 return
        return;
    }

    //绘画事件监听器
    //paint() 方法
    public void paint(Graphics g) {
        //如果尚未装入媒体文件
        if (first) {
            //获得主窗口的宽度和高度
            int w = getSize().width;
            int h = getSize().height;
            g.setColor(Color.blue); //用蓝色填充窗口内的区域
            g.fillRect(0, 0, w, h);
            //创建一种字体(DialogInput/粗体),并将它设置为主窗口的字体
            Font f = new Font("DialogInput", Font.BOLD, 16);
            g.setFont(f);
            FontMetrics fm = g.getFontMetrics();
            int swidth = fm.stringWidth("*** 欢迎 ***"); //计算机欢迎信息以象素计的宽度
            g.setColor(Color.white); //把绘图颜色改成白色
            g.drawString("*** 欢迎 ***",
                         (w - swidth) / 2,
                         (h + getInsets().top) / 2); //把主窗口的中央显示欢迎信息
        }

        // 调用超类Frame的paint()方法,该paint()方法将调用Frame包含的各个容器
        // 和部件(包括控制面板部件)的paint()方法。
        super.paint(g);

        //此处好像缺 return
        return;
    }


    // 不执行背景清除操作,以免控制面板部件闪烁
    public void update(Graphics g) {
        paint(g);

        //此处好像缺 return
        return;
    }

    //窗口监听器

    public void windowClosing(WindowEvent e) {
        if (player != null) {
            player.close();
        }
    }


    public static void main(String[] args) {
        //调用MediaPlayer的构造函数,创建住窗口(同时,隐含的创建/启动AWT后台线程)
        new MediaPlayer("媒体播放器1.0");
    }
}


//要用到的jmf.jar 包
//或者在本地安装 JMF-2_~1.EXE

你可能感兴趣的:(F#,vc++)