2014-11-08 120 views
0

我有一個按鈕,當點擊播放歌曲時,它不會停止,也不能按任何其他按鈕,直到音樂自行停止,歌曲結束。請幫忙! 我的代碼如下:如何阻止音樂播放?

public class Mp3Player { 

    private String filename; 
    private Player player; 


    public Mp3Player(String filename) { 
    this.filename = filename; 
    } 


    public void play() { 
try { 

     BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename)); 
     player = new Player(buffer); 
     player.play(); 

} 
catch (FileNotFoundException | JavaLayerException e) { 

    System.out.println(e); 
} 

    } 


    } 

而且這是在按鈕:在另一個線程

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

     Mp3Player mp3 = new Mp3Player("C:\\Users\\USER\\Desktop\\Echo.mp3"); 
     mp3.play(); 

    } 
+0

我建議閱讀有關線程.. http://docs.oracle.com/javase/tutorial/essential/concurrency/ – vefthym 2014-11-08 10:55:15

+0

什麼是'Player'? – 2014-11-08 11:16:18

回答

0

調用播放器#播放,這將讓你的歌曲,同時讓你的GUI仍然正常發揮(Swing中常見的方法)。

一旦它在它自己的線程中運行,你可以殺死線程停止它,有很多不同的方法來做到這一點...我將離開作業=)

0

創建thread在不暫停整個節目的情況下播放歌曲。

PS。我會寫這個作爲評論,但我沒有足夠的聲望點。

0

您正在執行的事件分派線程,這意味着你是阻止事件的處理阻塞調用(Player::play)(點擊按鈕共同&),直到player.play()回報。

取而代之的是,將其稱爲woker線程。首先定義一個SwingWorker

class PlayerWorker extends SwingWorker<Void, Void> { 
    private final Mp3Player mp3; 

    public PlayerWorker(String filename) { 
     mp3 = new Mp3Player(filename); 
    } 

    @Override 
    protected Void doInBackground() { 
     mp3.play(); 
     return null; 
    } 
} 

請介意使用Void(資本V)和return null。然後,把它想:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    (new PlayerWorker("C:\\Users\\USER\\Desktop\\Echo.mp3")).execute(); 
}