2013-11-21 76 views
1

在Java應用程序中,怎麼可能輸出音頻的油漆的功能?我試過這段代碼:Java的音頻塗料功能

public static void Player(String audioname){ //For audio 
    InputStream in = null; 
    try{ 
     in = new FileInputStream (new File (audioname)); 
    } 
    catch (FileNotFoundException e){ 
     System.err.print("Audio file not found!"); 
    } 
    try{ 
     as = new AudioStream (in); 
    } 
    catch (IOException e){ 
     System.err.print("AudioStream couldn't be created!"); 
    } 
} 
//////////////////////////////////////////////////////////////// 
try{ 
    Player(name); 
    AudioPlayer.player.start(as); 
} catch(Exception f){ 
    System.err.print("Audio couldn't be played!"); 
} 

...但是玩家被抓到Exception f catch語句。我也試着將其放置在不同的地方(如一個獨立的方法油漆通話,但它仍然無法正常工作的任何幫助

編輯:?

class playAudio implements Runnable{ 
    public void run(){ 
     try{ 
      Player("countdown.wav"); 
      AudioPlayer.player.start(as); 
     } catch(Exception f){ 
      System.err.print("Audio couldn't be played!"); 
     } 
    } 
} 
/////////////////////////////////////// 
public void paint(Graphics g){ //Draw function 
    Graphics2D g2d = (Graphics2D) g; 
    /////////////////////////////////// 
    Thread audioThrd = new Thread(new playAudio()); 
    audioThrd.start(); 
} 

在這裏,我添加了一個線程播放音頻文件,但「音頻無法播放!」還表示,我在做什麼錯在這裏?

+0

'「......在油漆功能輸出音頻?」「 - 這種說法並不完全意義的我。改變你的catch塊打印堆棧跟蹤,'f.printStackTrace()',並向我們顯示輸出。你可能會在錯誤的地方尋找hte文件。 –

+1

我的第一印象是,不要。 'paint'應該儘可能快地完成,不應該試圖加載資源...... – MadProgrammer

+0

'public void paint(Graphics g){...}' – Avadonia

回答

3

沒有,從來沒有做油漆的聲音裏。繪畫方法繪製,只有繪畫和應如果你的繪畫方法越慢,你的程序對用戶的反應就越差,運行音頻會創建一個長時間運行的過程,如果這發生在一個繪畫中你的程序的GUI會停下來,而不是你想要發生的事情。

相反,你要在一個後臺線程來播放音頻關閉Swing事件線程。 SwingWorker可以很好地工作,但任何古老的花園品種線程都可以。


編輯
對此代碼:

public void paint(Graphics g){ //Draw function 
    Graphics2D g2d = (Graphics2D) g; 
    /////////////////////////////////// 
    Thread audioThrd = new Thread(new playAudio()); 
    audioThrd.start(); 
} 

再次,不這樣做。請理解,你沒有的時候,甚至如果*油漆,因爲這是由JVM控制被調用了控制。您可以建議通過調用repaint()來調用它,但這並不保證能夠正常工作,特別是在重新繪製請求「堆疊」時。還要注意,當你沒有請求時,JVM可以調用paint,例如當操作系統通知它有一個窗口「髒」並需要重新繪製時。

因此,底線是:

不要嘗試播放音樂,從內部油漆或的paintComponent

至於爲什麼你的代碼是不是在玩音樂,你有沒有執行我的printStackTrace()的建議嗎?


接下來,我們談談爲什麼你不應該做的paint(Graphics g)內部描繪,而是應該做你的圖紙你的JComponent的paintComponent(Graphics g)方法裏面來代替。