
你好!很高兴为你解答。
首先,你打开这个登录窗口之后,你要求它能够播放音乐,你就在你启动的JFrame主线程main构造并显示完成JFrame后,新建一个方法叫做thisplayBgMusic();
这里解释一下,为什么叫你在启动JFrame主线程中调用这个方法而不是在你的QQLoinFrame的构造方法中调用,原因是Swing的处理机制原理是利用EventQueue来执行的,可以说,如果你直接new的话都是单线程(main)处理程序,这样的话就会对这个线程依赖过大,而这个线程也负荷过大。当你想启动播放音乐或者IO读写之类的耗时线程时,你可以试试在构造方法中执行这方法,你将会发现你的Swing程序没反应,要等某线程处理完后才可以继续显示。这里main线程阻塞,所以你的程序表面看起来不动,组件没反应,这就是因为阻塞掉了。解决这个问题的办法就是如下(这是其中一种,另一种你可以自行查找):
public static void main(String args[]) {
javaawtEventQueueinvokeLater(new Runnable() {
public void run() {
QQLogin qq = new QQLogin();
thisplayBgMusic();
}
});
}
正文
假设,你启动JFrame的主方法如下:
public static void main(String[] args) {
QQLogin qq = new QQLogin();
thisplayBgMusic();
}
thisplayBgMusic()方法
/
播放背景音乐,调用PlaySound线程类
/
public void playBgMusic() {
PlaySound play = new PlaySound();
Thread t = new Thread(play);
tstart();
}
PlaySound线程类
/
PlaySound线程类,其中,因为你要求不使用JMF,所以,请选择au或者wav格式吧
/
public class PlaySound implements Runnable{
public void run() {
try {
AudioClip audio;
URL url = null;
File musicFile = new File("msgwav");
URI uri = musicFiletoURI();
url = uritoURL();
audio = AppletnewAudioClip(url);
audioplay();
} catch (MalformedURLException ex) {
LoggergetLogger(PlayMsgSoundclassgetName())log(LevelSEVERE, null, ex);
}
}
}
播放音乐的代码 了解一下 可以直接加到小游戏里
package commusictest;import javazoomjldecoderJavaLayerException;
import javazoomjlplayerPlayer;
import javaio;
public class Music {
private String music;
private Player player;
public Music() throws FileNotFoundException, JavaLayerException {
FileInputStream file = new FileInputStream("e:/闹钟mp3");
BufferedInputStream name = new BufferedInputStream(file);
player = new Player(name);
playerplay();
}
public static void main(String[] args) throws FileNotFoundException, JavaLayerException{
new Music();
}
}
放音乐的api网上查有很多,比如javaxsoundmidi;
支持midi,mid背景音乐的播放
public class Music implements MetaEventListener, Runnable{
private Sequence sequence = null;
private Sequencer sequencer;
private boolean isPlaying = false;
private volatile Thread thread;
public Music(){
}
public Music(String midifile){
try {
loadMidi(midifile);
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (InvalidMidiDataException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
//导入midi文件到内存中传给Sequence对象,相当与编码器
public void loadMidi(String filename) throws IOException, InvalidMidiDataException{
sequence = MidiSystemgetSequence(thisgetClass()getResourceAsStream(filename));
}
//播放方法
public void play(){
if(isPlaying){
return;
}
try {
sequencer = MidiSystemgetSequencer();
sequenceropen();
//用Sequencer对象把声音文件序列解码出来播放
sequencersetSequence(sequence);
sequenceraddMetaEventListener(this);
//设置循环次数,-1表示一直循环
sequencersetLoopCount(-1);
sequencersetLoopStartPoint(0);
sequencersetLoopEndPoint(sequencergetTickLength());
} catch (MidiUnavailableException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (InvalidMidiDataException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
if(thread == null){
thread = new Thread(this);
threadstart();
}
}
public void stop(){
if(isPlaying){
sequencerstop();
isPlaying = false;
}
if(thread != null){
thread = null;
}
}
public void meta(MetaMessage meta) {
if(metagetType() == 47){
Systemoutprintln("Sequencer is done playing");
}
// TODO Auto-generated method stub
}
public void run() {
// TODO Auto-generated method stub
Thread current = ThreadcurrentThread();
while(current == thread && !isPlaying){
sequencerstart();
isPlaying = true;
try {
threadsleep(1001);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
//用起来也很方便
public static void main(String[] args){
Music music = new Music("amid");
musicplay();
}
}
如果这样写路径类要和音频文件放在一个目录下,如果你不想这样,有两种方法,一种是修改路径字符串,另一种是把ClassgetResourceAsStream方法改成new FileInputStream 这两个方法加载资源的初始路径不同,前者找class文件所在目录,后者找project目录
以上就是关于java 窗口怎么加背景音乐我已经写好窗口了全部的内容,包括:java 窗口怎么加背景音乐我已经写好窗口了、用Java编写了个小游戏想给游戏加上背景音乐用什么方法、我想把我的java小程序中嵌入一个背景音乐,写出添加背景音乐代码。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)