java实现音乐播放器(调整显示音量大小、调整进度、图片切换)

这篇具有很好参考价值的文章主要介绍了java实现音乐播放器(调整显示音量大小、调整进度、图片切换)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上学期老师布置了一个音乐播放器的作业,自己独立写的界面感觉还行就传上来了。

package Music;

import javax.sound.sampled.*;
import java.io.*;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Musicrun {
	JFrame frame = new JFrame("音乐播放器");

	JPanel p1 = new JPanel();
	JPanel p2 = new JPanel();
	JPanel p3 = new JPanel();

	Border etched = BorderFactory.createEtchedBorder();
	Border border = BorderFactory.createTitledBorder(etched, "");

	JButton jButton1 = new JButton("Start");
	JButton jButton2 = new JButton("Stop");
	JButton jButton3 = new JButton("Continue");

	boolean bofang = false;

	JLabel yinliang = new JLabel();
	JLabel musicImage = new JLabel();

	float ylforce = 0;

	double atime = 0;
	double bftime = 0;

	public String musicPath = "D:\\zuoye\\java\\resource\\test.wav";
	public AudioPlayer music = null;

	JSlider slider1 = new JSlider();

	JProgressBar progressBar = new JProgressBar();

	ImageIcon icon[] = { new ImageIcon("D:\\zuoye\\java\\resource\\b1.png"),
			new ImageIcon("D:\\zuoye\\java\\resource\\b2.png"),
			new ImageIcon("D:\\zuoye\\java\\resource\\b3.png"),
			new ImageIcon("D:\\zuoye\\java\\resource\\b4.png"),
			new ImageIcon("D:\\zuoye\\java\\resource\\b5.png") };

	public Musicrun() {
		frame.setSize(800, 800);
		frame.setLayout(new GridLayout(3, 1));

		border = BorderFactory.createTitledBorder("播放进度");
		p2.setBorder(border);

		border = BorderFactory.createTitledBorder("音量控制");
		p3.setBorder(border);

		init();

		frame.getContentPane().add(p1);
		frame.getContentPane().add(p2);
		frame.getContentPane().add(p3);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

	}

	private void init() {
		// p1部分
		musicImage.setIcon(icon[0]);
		p1.add(musicImage);

		Timer timer = new Timer();
		// timer.schedule(new MusicTask(), 500,1000);
		timer.schedule(new MusicTask(), 500, 2000);

		// p2部分
		music = new AudioPlayer(musicPath);

		progressBar.setMaximum(100);
		progressBar.setMinimum(0);
		progressBar.setStringPainted(true);
		progressBar.setIndeterminate(false);
		progressBar.setPreferredSize(new Dimension(780, 30));
		;
		;
		p2.add(progressBar);

		Timer timer2 = new Timer();
		timer2.schedule(new MusicTask2(), 0, 100);

		jButton1.setSize(80, 40);
		jButton2.setSize(80, 40);
		jButton3.setSize(80, 40);
		p2.add(jButton1);
		p2.add(jButton2);
		p2.add(jButton3);
		jButton1.addActionListener(new ButtonHandler());
		jButton2.addActionListener(new ButtonHandler1());
		jButton3.addActionListener(new ButtonHandler2());

		// p3部分
		yinliang.setText("当前音量为:" + slider1.getValue());
		// yinliang.setBounds(0,630,100,20);
		p3.setLayout(new BorderLayout());
		p3.add(yinliang, BorderLayout.WEST);

		slider1.setValue(100);
		slider1.setPaintTicks(true);// setPaintTicks()方法是设置是否在JSlider加上刻度,若为true则下面两行才有作用。
		slider1.setMajorTickSpacing(20);
		slider1.setMinorTickSpacing(5);
		slider1.setPaintLabels(true);// setPaintLabels()方法为设置是否数字标记,若设为true,则JSlider刻度上就会有数值出现。
		slider1.setPaintTrack(true);// setPaintTrack()方法表示是否出现滑动杆的横杆。默认值为true.
		slider1.setSnapToTicks(true);// setSnapToTicks()方法表示一次移动一个小刻度,而不再是一次移动一个单位刻度。
		// JLabel label1 = new JLabel("目前刻度:" + );
		slider1.addChangeListener(new ChangeListener() {

			@Override
			public void stateChanged(ChangeEvent e) {
				yinliang.setText("当前音量:" + slider1.getValue());
				ylforce = (float) ((0.86) * slider1.getValue() - 80);
				music.setVol(ylforce);

			}
		});
		p3.add(slider1, BorderLayout.SOUTH);

	}

	public class MusicTask extends TimerTask {
		// TODO 自动生成的方法存根
		int i = 0;

		@Override
		public void run() {
			musicImage.setIcon(icon[i]);
			i++;
			if (i == 5) {
				i = 0;
			}
		}
	}

	public class MusicTask2 extends TimerTask {
		// TODO 自动生成的方法存根
		// double progressValues;
		int progressBarValues;

		@Override
		public void run() {

			if (bofang == true) {
				bftime += 0.1;
				progressBarValues = (int) ((bftime / atime) * 100);
				progressBar.setValue(progressBarValues);
			}
		}
	}

	private class ButtonHandler implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (bofang == false) {
				bofang = true;
				bftime = 0;
				music.start(bofang);

			} else {
				music.start(bofang);
			}
		}
	}

	private class ButtonHandler1 implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (bofang == true) {
				bofang = false;
				music.stop();
			} else {
				music.stop();
			}
		}
	}

	private class ButtonHandler2 implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (bofang == false) {
				bofang = true;
				music.continues();
			} else {
				music.continues();
			}
		}
	}

	public class AudioPlayer {
		private String musicPath; // 音频文件
		private volatile boolean run = true; // 记录音频是否播放
		private Thread mainThread; // 播放音频的任务线程
		private float newVolumn = 7;

		private AudioInputStream audioStream;
		private AudioFormat audioFormat;
		private SourceDataLine sourceDataLine;

		public AudioPlayer(String musicPath) {
			this.musicPath = musicPath;
			prefetch();
		}

		// 数据准备
		private void prefetch() {
			try {
				// 获取音频输入流
				audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
				// 获取音频的编码对象
				audioFormat = audioStream.getFormat();
				// 包装音频信息
				DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,
						AudioSystem.NOT_SPECIFIED);
				// 使用包装音频信息后的Info类创建源数据行,充当混频器的源
				sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
				// 获得音频的总时长
				atime = audioStream.getFrameLength() / audioFormat.getSampleRate();

				sourceDataLine.open(audioFormat);
				sourceDataLine.start();

			} catch (UnsupportedAudioFileException ex) {
				ex.printStackTrace();
			} catch (LineUnavailableException ex) {
				ex.printStackTrace();
			} catch (IOException ex) {
				ex.printStackTrace();
			}

		}

		// 析构函数:关闭音频读取流和数据行
		protected void finalize() throws Throwable {
			super.finalize();
			sourceDataLine.drain();
			sourceDataLine.close();
			audioStream.close();
		}

		// 播放音频:通过loop参数设置是否循环播放
		private void playMusic(boolean loop) throws InterruptedException {

			try {
				if (loop) {
					while (true) {
						playMusic();
						bftime = 0;
					}
				} else {
					playMusic();
					// 清空数据行并关闭
					sourceDataLine.drain();
					sourceDataLine.close();
					audioStream.close();
				}

			} catch (IOException ex) {
				ex.printStackTrace();
			}

		}

		private void playMusic() {
			try {
				synchronized (this) {
					run = true;
				}
				// 通过数据行读取音频数据流,发送到混音器;
				// 数据流传输过程:AudioInputStream -> SourceDataLine;
				audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
				int count;
				byte tempBuff[] = new byte[1024];

				while ((count = audioStream.read(tempBuff, 0, tempBuff.length)) != -1) {
					synchronized (this) {
						while (!run)
							wait();
					}
					sourceDataLine.write(tempBuff, 0, count);
				}

			} catch (UnsupportedAudioFileException ex) {
				ex.printStackTrace();
			} catch (IOException ex) {
				ex.printStackTrace();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}

		// 暂停播放音频
		private void stopMusic() {
			synchronized (this) {
				run = false;
				notifyAll();
			}
		}

		// 继续播放音乐
		private void continueMusic() {
			synchronized (this) {
				run = true;
				notifyAll();
			}
		}

		// 外部调用控制方法:生成音频主线程;
		public void start(boolean loop) {
			mainThread = new Thread(new Runnable() {
				public void run() {
					try {
						playMusic(loop);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
			mainThread.start();
		}

		// 外部调用控制方法:暂停音频线程
		public void stop() {
			new Thread(new Runnable() {
				public void run() {
					stopMusic();
				}
			}).start();
		}

		// 外部调用控制方法:继续音频线程
		public void continues() {
			new Thread(new Runnable() {
				public void run() {
					continueMusic();
				}
			}).start();
		}

		// 播放器的状态
		public boolean isPlaying() {
			return run;
		}

		// 设置音频音量
		// https://zhidao.baidu.com/question/269020584.html
		public void setVol(float value) {
			newVolumn = value;
			// 必须open之后
			if (newVolumn != 7) {
				FloatControl control = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
				// System.out.println(control.getMaximum());
				// System.out.println(control.getMinimum());
				control.setValue(newVolumn);
			}
		}

		// 销毁
		public void destroy() {
			try {
				finalize();
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

然后底下是主函数

package Music;

public class JavaMain {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		new Musicrun();
	}

}

关于进度条进度的问题,可以利用计时器统计当前已经播放的时间。然后利用函数计算音乐播放的总时间。两者相除就能得出当前的进度了。文章来源地址https://www.toymoban.com/news/detail-517718.html

到了这里,关于java实现音乐播放器(调整显示音量大小、调整进度、图片切换)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt实现本地音乐播放器

     mainwindow.h mainwindow.cpp qss: 源码:Qt与学习通页面: 记录与Qt相关的代码 - Gitee.com

    2024年02月12日
    浏览(43)
  • 学习笔记(1)——粤嵌gec6818实现电子相册,音乐播放器,视频播放器。

    (1)设计一个初始界面,并且设置电子相册,音乐播放器,视频播放器三个触摸按键。 (2)电子相册——能够实现相册的幻灯片功能,实现相册左右滑动切换相片。 (3)音乐播放器实现——切歌,播放和暂停功能。 (4)视频播放器实现——播放、暂停、音量大小、快进倒

    2024年02月11日
    浏览(50)
  • Android Studio 实现音乐播放器

    🍅 文章末尾有获取完整项目源码方式 🍅         Android初学者开发第一个完整的实例项目应该就属《音乐播放器》了,项目包含SQLlit数据库的使用、listview、Fragment、等。话不多说先上成品: Android Studio 音乐播放器 图片效果展示: 1.启动页效果 2.登录页效果 3.注册页效果

    2024年02月06日
    浏览(44)
  • Kotlin实现简单的音乐播放器

    关于音乐播放器,我真的是接触比较多,听歌作为我第一大爱好,之前也用Java设计过音乐播放器,感兴趣的同学可以阅读:Android Studio如何实现音乐播放器(简单易上手)和 Android Studio实现音乐播放器2.0 理论知识 掌握Kotlin面向对象的软件开发方面的基础知识。 巩固前期Act

    2024年02月10日
    浏览(36)
  • java微信小程序音乐播放器分享系统

    随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐

    2024年02月11日
    浏览(38)
  • Django实现简单的音乐播放器 2

     在《Django实现简单的音乐播放器 1》前期准备的基础上开始开发。  效果: 目录 项目视图 创建视图方法 路由加载视图 加载模板 创建首页html文件 加载静态资源文件 加载静态文件 使用方法 启动服务器 加载数据表 创建表模型 生成表迁移 执行创建表 插入表数据 播放歌曲列

    2024年02月12日
    浏览(34)
  • Django实现简单的音乐播放器 4

    在原有音乐播放器功能基础上,增加上传音乐功能。  效果: 目录 配置上传路径 配置路由 视图处理歌曲 引入类库 保存歌曲文件 模板上传 设置菜单列表 设置菜单列表样式 脚本设置 上传效果 1.显示菜单列表 2.点击上传歌曲 3.上传完成 4.查看保存文件 增加数据库操作 修改验

    2024年02月15日
    浏览(37)
  • tkinter+爬虫+pygame实现音乐播放器

    本文将涉及爬虫(数据的获取),pygame(音乐播放器),tkinter(界面显示),将他们汇聚到一起制造一个音乐播放器,欢迎大家的订阅。 pip install requests pip install parsel pip install lxpy pip install pygame

    2024年02月20日
    浏览(35)
  • Django实现简单的音乐播放器 3

     在原有音乐播放器上请求方式优化和增加加载本地音乐功能。 效果: 目录 播放列表优化 设置csrf_token 前端改为post请求 视图端增加post验证 加载歌曲 视图 设置路由 模板 加载layui css 加载layui js 增加功能列表 功能列表脚本实现 最终效果 总结 原有get请求改为post请求。 设置

    2024年02月12日
    浏览(37)
  • Django实现简单的音乐播放器 1

    使用django框架开发一个简单的音乐播放器。 效果: 目录 环境准备 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 配置时区 配置语言 配置子应用路由 在player应用目录下创建urls.py文件

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包