• 第二十九节(java-开发简单音乐播放器 )


    package com.tanzhou.jmf;
    
    import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    
    import javax.swing.*;
    // JFrame java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。
    /**
     * ActionListener是Java中关于事件处理的一个接口,继承自EventListener。
    ActionListener用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,
    而使用该类创建的对象可使用组件的 addActionListener 
    方法向该组件注册。在发生操作事件时,调用该对象的 actionPerformed 方法。
     */
    public class SoundPlayer extends JFrame implements ActionListener {
        AudioClip adc; // 声明音频剪辑对象adc
    
        URL url; // 声明资源定位符对象url
    
        JLabel lb = new JLabel();// 创建一个标签对象lb
    
        JLabel la = new JLabel();// 创建一个标签对象la
    
        File file;// 声明文件对象file
    
        String fileName;// 声明fileName变量,用于记录方件的名称
    
        boolean loop = false;// 定义loop变量,用来判断是否进行偱环操作
    
        JFileChooser chooser = new JFileChooser();// 创建一个文件选择器对象chooser
    
        //Icon a = new ImageIcon("C:\Documents and Settings\Administrator\桌面\image\ying.jpg");// 创建一个组件图片
    
        JPanel pn1 = new JPanel();// 创建一个面板容器对象,默认部局为:FlowLayout
    
        public static void main(String[] args) {
            new SoundPlayer();// 给程序传入title
        }
    
        public SoundPlayer() {// 本类的构造器,起到初始化的作用,相当于Applect的init方法
            super("音乐播放器");// 调用JFrame的构造方法,其作用是创建一个新的、初始不可见的、具有指定标题的 Frame
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {// 用户单击窗口系统菜单的关闭按钮,调用dispose以执行windowClosed
                    dispose();
                    if (adc != null) {// 在音频剪辑adc不为null的情况下,关闭窗口的同时,声音也消失
                        adc.stop();
                    }
                }
            });
            JButton[] bn = new JButton[3];// 创建JButton数组
            /**
             * FlowLayout(流式布局)       组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列
               BorderLayout(边界布局)     容器划分为东、西、南、北、中五个区域,每个区域只能放置一个组件。
               GridLayout(网格布局)       容器的空间划分成M×N列的网格区域, 每个区域只能放置一个组件。
               CardLayout(卡片布局)       如同一叠牌,每个牌对应一个组件,但每次只能显示其中的一张牌。适用于在一个空间中防止多个组件的情况
               GridBagLayout(网格包布局)  GridLayout的升级版,组件仍然是按照行、列放置,但是每个组件可以占据多个网格
             */
            JPanel pn = new JPanel(new GridLayout());// 创建一个面板容器对象pn,部局为:GridLayout
    
            Icon[] ic = new Icon[3];// 创建Icon数组
            for (int i = 0; i < ic.length; i++) {// 为每个Icon对象赋图像
                ic[i] = new ImageIcon("C:\Users\Tony Liu\Desktop\image\"
                        + (i + 1) + ".gif");
            }
            bn[0] = new JButton("开始", ic[0]);// 创建一个有文字,带图标的按扭对象
            bn[0].addActionListener(this);// 添加事件侦听
            bn[1] = new JButton("停止", ic[1]);
            bn[1].addActionListener(this);
            bn[2] = new JButton("循环", ic[2]);
            bn[2].addActionListener(this);
            pn.add(bn[0], 0);// 将开始按扭添加到面板pn的第1个位置上
            pn.add(bn[1], 1);// 同上
            pn.add(bn[2], 2);// 同上
            this.add(pn, BorderLayout.SOUTH);// 将面板pn添加到Frame中
    //        // 创建播放器的菜单
            JMenu fileMenu = new JMenu("文件");
            JMenuItem openMemuItem = new JMenuItem("打开");
            openMemuItem.addActionListener(this);
            fileMenu.add(openMemuItem);
            fileMenu.addSeparator();// 添加一个分割条
            JMenuItem exitMemuItem = new JMenuItem("退出");
            exitMemuItem.addActionListener(this);
            fileMenu.add(exitMemuItem);
    
            JMenuBar menuBar = new JMenuBar();
            menuBar.add(fileMenu);
            String flag = "欢迎光临";
            this.setFrame(flag);// 调用setFrame方法
            this.setJMenuBar(menuBar);
            this.setSize(300, 360);// 设置Frame的大小
            this.setVisible(true);// 将Frame设置为可见
    
        }
    
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("退出")) {// 如果单击退出菜单项,关闭windows窗口
                dispose();// 调用dispose以便执行windowClosed
                return;
            }
            if (e.getActionCommand().equals("打开")) {// 如果单击打开菜单项,选择音乐播放文件
                int val = chooser.showOpenDialog(this);// 接收文件选择器的返回状态
                if (val == JFileChooser.APPROVE_OPTION) {// 如果返回状态为APPROVE_OPTION
                    file = chooser.getSelectedFile();// 返回选中的文件
                    fileName = file.getName();// 获取选中的文件的文件名
                    String flag = "您正在欣赏:" + fileName;
                    this.setFrame(flag);
                    try {
                        URL url = new URL("file:" + file.getPath());// 创建资源定位符
                        adc = JApplet.newAudioClip(url);// 为音频剪辑对象adc赋值
                        adc.play();// 开始播放此音频剪辑
                    } catch (MalformedURLException e1) {
                        System.out.println("不能播放此文件");
                    }
                }
            }
            // 如果用户放弃选择文件,则返回
            if (e.getActionCommand().equals("开始")) {
                String flag = "您正在欣赏:" + fileName;
                if (adc == null) {
                    flag = "请选择播放文件";
                    this.setFrame(flag);
                    return;
                }
                adc.play();
                this.setFrame(flag);
            }
            if (e.getActionCommand().equals("停止")) {
                adc.stop();// 停止播放此音频剪辑。
                String flag = "停止播放:" + fileName;
                this.setFrame(flag);
            }
            if (e.getActionCommand().equals("循环")) {
                loop = !loop;
                String flag = "";
                if (loop) {
                    adc.play();
                    adc.loop();// 以循环方式开始播放此音频剪辑
                    flag = "循环播放:" + fileName;
                } else {
                    adc.play();
                    flag = "顺序播放:" + fileName;
                }
                this.setFrame(flag);
            }
    
        }
        /**
         * 提取公共的部分
         * 
         * 
         * @param flag
         */
        public void setFrame(String flag) {
            la.setText(flag);
            //lb.setIcon(a);
            pn1.add(la, 0);
            //pn1.add(lb, 1);
            this.add(pn1, FlowLayout.CENTER);
        }
    }
  • 相关阅读:
    js正则表达式
    js遍历对象属性
    C# 带Cookies发送请求
    C# Cookies设置和读取
    C# ref 和 out 的使用
    jq 禁用复选框 和输入框
    C++学习之嵌套类和局部类
    C++学习之this指针
    C++学习之运算符重载的总结
    Labview中引用,属性节点,局部变量之间的区别
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/4279722.html
Copyright © 2020-2023  润新知