国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java實(shí)現(xiàn)音樂(lè)播放器(調(diào)整顯示音量大小、調(diào)整進(jìn)度、圖片切換)

這篇具有很好參考價(jià)值的文章主要介紹了java實(shí)現(xiàn)音樂(lè)播放器(調(diào)整顯示音量大小、調(diào)整進(jìn)度、圖片切換)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

上學(xué)期老師布置了一個(gè)音樂(lè)播放器的作業(yè),自己獨(dú)立寫(xiě)的界面感覺(jué)還行就傳上來(lái)了。

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("音樂(lè)播放器");

	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("播放進(jìn)度");
		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("當(dāng)前音量為:" + slider1.getValue());
		// yinliang.setBounds(0,630,100,20);
		p3.setLayout(new BorderLayout());
		p3.add(yinliang, BorderLayout.WEST);

		slider1.setValue(100);
		slider1.setPaintTicks(true);// setPaintTicks()方法是設(shè)置是否在JSlider加上刻度,若為true則下面兩行才有作用。
		slider1.setMajorTickSpacing(20);
		slider1.setMinorTickSpacing(5);
		slider1.setPaintLabels(true);// setPaintLabels()方法為設(shè)置是否數(shù)字標(biāo)記,若設(shè)為true,則JSlider刻度上就會(huì)有數(shù)值出現(xiàn)。
		slider1.setPaintTrack(true);// setPaintTrack()方法表示是否出現(xiàn)滑動(dòng)桿的橫桿。默認(rèn)值為true.
		slider1.setSnapToTicks(true);// setSnapToTicks()方法表示一次移動(dòng)一個(gè)小刻度,而不再是一次移動(dòng)一個(gè)單位刻度。
		// JLabel label1 = new JLabel("目前刻度:" + );
		slider1.addChangeListener(new ChangeListener() {

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

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

	}

	public class MusicTask extends TimerTask {
		// TODO 自動(dòng)生成的方法存根
		int i = 0;

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

	public class MusicTask2 extends TimerTask {
		// TODO 自動(dòng)生成的方法存根
		// 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; // 播放音頻的任務(wù)線程
		private float newVolumn = 7;

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

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

		// 數(shù)據(jù)準(zhǔn)備
		private void prefetch() {
			try {
				// 獲取音頻輸入流
				audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
				// 獲取音頻的編碼對(duì)象
				audioFormat = audioStream.getFormat();
				// 包裝音頻信息
				DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,
						AudioSystem.NOT_SPECIFIED);
				// 使用包裝音頻信息后的Info類創(chuàng)建源數(shù)據(jù)行,充當(dāng)混頻器的源
				sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
				// 獲得音頻的總時(shí)長(zhǎng)
				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();
			}

		}

		// 析構(gòu)函數(shù):關(guān)閉音頻讀取流和數(shù)據(jù)行
		protected void finalize() throws Throwable {
			super.finalize();
			sourceDataLine.drain();
			sourceDataLine.close();
			audioStream.close();
		}

		// 播放音頻:通過(guò)loop參數(shù)設(shè)置是否循環(huán)播放
		private void playMusic(boolean loop) throws InterruptedException {

			try {
				if (loop) {
					while (true) {
						playMusic();
						bftime = 0;
					}
				} else {
					playMusic();
					// 清空數(shù)據(jù)行并關(guān)閉
					sourceDataLine.drain();
					sourceDataLine.close();
					audioStream.close();
				}

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

		}

		private void playMusic() {
			try {
				synchronized (this) {
					run = true;
				}
				// 通過(guò)數(shù)據(jù)行讀取音頻數(shù)據(jù)流,發(fā)送到混音器;
				// 數(shù)據(jù)流傳輸過(guò)程: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();
			}
		}

		// 繼續(xù)播放音樂(lè)
		private void continueMusic() {
			synchronized (this) {
				run = true;
				notifyAll();
			}
		}

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

		// 外部調(diào)用控制方法:暫停音頻線程
		public void stop() {
			new Thread(new Runnable() {
				public void run() {
					stopMusic();
				}
			}).start();
		}

		// 外部調(diào)用控制方法:繼續(xù)音頻線程
		public void continues() {
			new Thread(new Runnable() {
				public void run() {
					continueMusic();
				}
			}).start();
		}

		// 播放器的狀態(tài)
		public boolean isPlaying() {
			return run;
		}

		// 設(shè)置音頻音量
		// 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();
			}
		}
	}

}

然后底下是主函數(shù)

package Music;

public class JavaMain {

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

}

關(guān)于進(jìn)度條進(jìn)度的問(wèn)題,可以利用計(jì)時(shí)器統(tǒng)計(jì)當(dāng)前已經(jīng)播放的時(shí)間。然后利用函數(shù)計(jì)算音樂(lè)播放的總時(shí)間。兩者相除就能得出當(dāng)前的進(jìn)度了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-517718.html

到了這里,關(guān)于java實(shí)現(xiàn)音樂(lè)播放器(調(diào)整顯示音量大小、調(diào)整進(jìn)度、圖片切換)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt實(shí)現(xiàn)本地音樂(lè)播放器

    Qt實(shí)現(xiàn)本地音樂(lè)播放器

    ?mainwindow.h mainwindow.cpp qss: 源碼:Qt與學(xué)習(xí)通頁(yè)面: 記錄與Qt相關(guān)的代碼 - Gitee.com

    2024年02月12日
    瀏覽(30)
  • 學(xué)習(xí)筆記(1)——粵嵌gec6818實(shí)現(xiàn)電子相冊(cè),音樂(lè)播放器,視頻播放器。

    學(xué)習(xí)筆記(1)——粵嵌gec6818實(shí)現(xiàn)電子相冊(cè),音樂(lè)播放器,視頻播放器。

    (1)設(shè)計(jì)一個(gè)初始界面,并且設(shè)置電子相冊(cè),音樂(lè)播放器,視頻播放器三個(gè)觸摸按鍵。 (2)電子相冊(cè)——能夠?qū)崿F(xiàn)相冊(cè)的幻燈片功能,實(shí)現(xiàn)相冊(cè)左右滑動(dòng)切換相片。 (3)音樂(lè)播放器實(shí)現(xiàn)——切歌,播放和暫停功能。 (4)視頻播放器實(shí)現(xiàn)——播放、暫停、音量大小、快進(jìn)倒

    2024年02月11日
    瀏覽(44)
  • Android Studio 實(shí)現(xiàn)音樂(lè)播放器

    Android Studio 實(shí)現(xiàn)音樂(lè)播放器

    ?? 文章末尾有獲取完整項(xiàng)目源碼方式 ?? ????????Android初學(xué)者開(kāi)發(fā)第一個(gè)完整的實(shí)例項(xiàng)目應(yīng)該就屬《音樂(lè)播放器》了,項(xiàng)目包含SQLlit數(shù)據(jù)庫(kù)的使用、listview、Fragment、等。話不多說(shuō)先上成品: Android Studio 音樂(lè)播放器 圖片效果展示: 1.啟動(dòng)頁(yè)效果 2.登錄頁(yè)效果 3.注冊(cè)頁(yè)效果

    2024年02月06日
    瀏覽(24)
  • Kotlin實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器

    Kotlin實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器

    關(guān)于音樂(lè)播放器,我真的是接觸比較多,聽(tīng)歌作為我第一大愛(ài)好,之前也用Java設(shè)計(jì)過(guò)音樂(lè)播放器,感興趣的同學(xué)可以閱讀:Android Studio如何實(shí)現(xiàn)音樂(lè)播放器(簡(jiǎn)單易上手)和 Android Studio實(shí)現(xiàn)音樂(lè)播放器2.0 理論知識(shí) 掌握Kotlin面向?qū)ο蟮能浖_(kāi)發(fā)方面的基礎(chǔ)知識(shí)。 鞏固前期Act

    2024年02月10日
    瀏覽(18)
  • java微信小程序音樂(lè)播放器分享系統(tǒng)

    java微信小程序音樂(lè)播放器分享系統(tǒng)

    隨著我國(guó)經(jīng)濟(jì)迅速發(fā)展,人們對(duì)手機(jī)的需求越來(lái)越大,各種手機(jī)軟件也都在被廣泛應(yīng)用,但是對(duì)于手機(jī)進(jìn)行數(shù)據(jù)信息管理,對(duì)于手機(jī)的各種軟件也是備受用戶的喜愛(ài),音樂(lè)播放器小程序被用戶普遍使用,為方便用戶能夠可以隨時(shí)進(jìn)行音樂(lè)播放器小程序的數(shù)據(jù)信息管理,特開(kāi)發(fā)了基于音樂(lè)

    2024年02月11日
    瀏覽(26)
  • PyQt5實(shí)現(xiàn)簡(jiǎn)易音樂(lè)播放器

    PyQt5實(shí)現(xiàn)簡(jiǎn)易音樂(lè)播放器

    環(huán)境 vscode python 3.10.0 PyQt5 5.15.4 功能目標(biāo) 能夠讀取本地的音樂(lè)文件,并實(shí)現(xiàn)播放的開(kāi)關(guān)、曲目的切換和音量的加減 具體實(shí)現(xiàn) 新建一個(gè)文件夾,在文件夾下再新建一個(gè)文件夾,命名為music,將歌曲放入其中。在vscode中打開(kāi)該文件夾。 在QtDesigner中搭建出UI界面,并使用pyuic工具轉(zhuǎn)

    2024年02月13日
    瀏覽(17)
  • Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 4

    Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 4

    在原有音樂(lè)播放器功能基礎(chǔ)上,增加上傳音樂(lè)功能。 ?效果: 目錄 配置上傳路徑 配置路由 視圖處理歌曲 引入類庫(kù) 保存歌曲文件 模板上傳 設(shè)置菜單列表 設(shè)置菜單列表樣式 腳本設(shè)置 上傳效果 1.顯示菜單列表 2.點(diǎn)擊上傳歌曲 3.上傳完成 4.查看保存文件 增加數(shù)據(jù)庫(kù)操作 修改驗(yàn)

    2024年02月15日
    瀏覽(24)
  • 微信小程序?qū)崿F(xiàn)音樂(lè)播放器(1)

    微信小程序?qū)崿F(xiàn)音樂(lè)播放器(1)

    代碼涉及的主要文件有: app.json app.wxss pages/music/music.json pages/music/music.wxml pages/music/music.wxss pages/music/music.js 另外,你可能需要的圖片資源,在這里! BackgroundAudioManager實(shí)現(xiàn)背景音樂(lè) imzusheng / netease-music-uniapp

    2024年02月09日
    瀏覽(24)
  • Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 3

    Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 3

    ?在原有音樂(lè)播放器上請(qǐng)求方式優(yōu)化和增加加載本地音樂(lè)功能。 效果: 目錄 播放列表優(yōu)化 設(shè)置csrf_token 前端改為post請(qǐng)求 視圖端增加post驗(yàn)證 加載歌曲 視圖 設(shè)置路由 模板 加載layui css 加載layui js 增加功能列表 功能列表腳本實(shí)現(xiàn) 最終效果 總結(jié) 原有g(shù)et請(qǐng)求改為post請(qǐng)求。 設(shè)置

    2024年02月12日
    瀏覽(20)
  • Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 1

    Django實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器 1

    使用django框架開(kāi)發(fā)一個(gè)簡(jiǎn)單的音樂(lè)播放器。 效果: 目錄 環(huán)境準(zhǔn)備 安裝django 創(chuàng)建項(xiàng)目 創(chuàng)建應(yīng)用 注冊(cè)應(yīng)用 配置數(shù)據(jù)庫(kù) 設(shè)置數(shù)據(jù)庫(kù)配置 設(shè)置pymysql庫(kù)引用 創(chuàng)建數(shù)據(jù)庫(kù) 創(chuàng)建數(shù)據(jù)表 生成表遷移文件 執(zhí)行表遷移 配置時(shí)區(qū) 配置語(yǔ)言 配置子應(yīng)用路由 在player應(yīng)用目錄下創(chuàng)建urls.py文件

    2024年02月12日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包