⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playsound.java

📁 Java版拼图游戏
💻 JAVA
字号:
/*
 * @(#)ImageRevert.java 1.0 03/08/20
 * Copyright 2003 Entao Zhang, All rights reserved.
 */

import java.applet.*;
import javax.sound.midi.*;
import java.net.*;
import java.awt.Component;
import javax.swing.JOptionPane;

/**
 * midi播放线程类.使用线程循环播放.
 */
public class PlaySound implements Runnable{
	private Thread t;
	private Component parent;
	private Sequence sequence;
	private Sequencer player;
	//程序运行的URL或本机路径.
	private URL codeBase;
	//支持运行URL下的个Midi文件(可修改),如果不存在则播放下一个.不影响使用.
	private String[] sounds={"midi/01.mid","midi/02.mid","midi/03.mid",
							"midi/04.mid","midi/05.mid","midi/06.mid",
							"midi/07.mid","midi/08.mid"};
	//当前播放文件索引.
	private int index=0;
	//是否在播放完自动循环.circle是否依次循环或单首文件循环.
	private boolean loop=true,circle=true;
	
	public PlaySound(Component parent,URL codeBase){
		this.parent=parent;
		this.codeBase=codeBase;
		try{
			player=MidiSystem.getSequencer();
		}catch(MidiUnavailableException e){}
	}

	//选择播放曲目.
	public void chooseSound(){
		Object value=JOptionPane.showInputDialog(parent,"请选择背景音乐:",
					"选择背景音乐",JOptionPane.QUESTION_MESSAGE, null,
					sounds,sounds[index]);
		if (value==null) return;
		for (int i=0; i<sounds.length; i++){
			if (((String)value).equals(sounds[i])){
				loadAndPlay(i);
				return;
			}
		}
	}

	//按给定的索引加载并播放曲目.
	public void loadAndPlay(int index){
		if (sounds==null || index<0 || index>(sounds.length-1)) return;
		this.index=index;
		//先关闭正在播放的曲目.
		stop();
		t=new Thread(this);
		t.setPriority(Thread.MIN_PRIORITY);
		t.start();
	}

	//保证线程安全性
	synchronized public void run() {
		try{
			//加载曲目.
			sequence=MidiSystem.getSequence(new URL(codeBase,sounds[index]));
			player.open();
			player.setSequence(sequence);
			player.start();
			//当曲目开始播放时设置自动循环
			loop=true;
			//等待播放结束.
			while(player.isRunning()){
				Thread.sleep(500);
			}
		}catch(Exception e){
			//如果加载文件失败,则设置自动循环,并转向下一首.
			loop=true;
		}
		player.close();
		//进行循环.
		if (loop){
			if (circle){
				loadAndPlay(index==(sounds.length-1)?0:index+1);
			}else{
				loadAndPlay(index);
			}
		}
	}

	//停止播放和循环运作.
	public void stop(){
		if (player.isRunning()){
			loop=false;
			player.stop();
		}
	}

	//开始或重新开始播放.
	public void start(){
		if (sequence==null){
			loadAndPlay(0);
		}else loadAndPlay(index);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -