首先,妳打開這個登錄窗口之後,妳要求它能夠播放音樂,妳就在妳啟動的JFrame主線程main構造並顯示完成JFrame後,新建壹個方法叫做this.playBgMusic();
這裏解釋壹下,為什麽叫妳在啟動JFrame主線程中調用這個方法而不是在妳的QQLoinFrame的構造方法中調用,原因是Swing的處理機制原理是利用EventQueue來執行的,可以說,如果妳直接new的話都是單線程(main)處理程序,這樣的話就會對這個線程依賴過大,而這個線程也負荷過大。當妳想啟動播放音樂或者IO讀寫之類的耗時線程時,妳可以試試在構造方法中執行這方法,妳將會發現妳的Swing程序沒反應,要等某線程處理完後才可以繼續顯示。這裏main線程阻塞,所以妳的程序表面看起來不動,組件沒反應,這就是因為阻塞掉了。解決這個問題的辦法就是如下(這是其中壹種,另壹種妳可以自行查找):
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
QQLogin qq = new QQLogin();
this.playBgMusic();
}
});
}
*********************************************正文********************************************************
假設,妳啟動JFrame的主方法如下:
public static void main(String[] args) {
QQLogin qq = new QQLogin();
this.playBgMusic();
}
*******************************************this.playBgMusic()方法*********************************************
/**
*播放背景音樂,調用PlaySound線程類
/
public void playBgMusic() {
PlaySound play = new PlaySound();
Thread t = new Thread(play);
t.start();
}
*******************************************PlaySound線程類********************************************
/**
*PlaySound線程類,其中,因為妳要求不使用JMF,所以,請選擇.au或者.wav格式吧
/
public class PlaySound implements Runnable{
public void run() {
try {
AudioClip audio;
URL url = null;
File musicFile = new File("msg.wav");
URI uri = musicFile.toURI();
url = uri.toURL();
audio = Applet.newAudioClip(url);
audio.play();
} catch (MalformedURLException ex) {
Logger.getLogger(PlayMsgSound.class.getName()).log(Level.SEVERE, null, ex);
}
}
}