2014-03-18 37 views
2

我正在寫一個簡單的遊戲,並嘗試播放聲音,但是當我創建媒體對象時它無法使其正常工作IllegalArgumentException。我不是一個Java編碼器,任何幫助將不勝感激。 下面是一個示例代碼:如何正確使用JavaFX MediaPlayer?

import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 

public class Main{ 
    public static void main(String[] args) { 

     Media pick = new Media("put.mp3"); //throws here 
     MediaPlayer player = new MediaPlayer(pick); 
     player.play(); 
    } 
} 

顯然「put.mp3」的存在,並且在正確的目錄,我檢查使用路徑:System.out.println(System.getProperty("user.dir"));

我究竟錯在這裏做什麼?

+0

我發現文件路徑應該寫爲「file://put.mp3」。 現在我得到'MediaException:MEDIA_INACCESSIBLE:put.mp3' –

回答

9

問題是因爲您試圖運行JavaFX Application thread以外的JavaFX場景圖形控件。

運行JavaFX應用程序線程內的所有JavaFX場景圖節點。

您可以通過擴展JavaFX Application類和覆蓋start()方法來啓動JavaFX線程。

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     Media pick = new Media("put.mp3"); // replace this with your own audio file 
     MediaPlayer player = new MediaPlayer(pick); 

     // Add a mediaView, to display the media. Its necessary ! 
     // This mediaView is added to a Pane 
     MediaView mediaView = new MediaView(player); 

     // Add to scene 
     Group root = new Group(mediaView); 
     Scene scene = new Scene(root, 500, 200); 

     // Show the stage 
     primaryStage.setTitle("Media Player"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     // Play the media once the stage is shown 
     player.play(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

這一切似乎都很好,但我們可以說,我有一個世界上的球員角色,可以放下東西在地上,當他做我想播放一個明顯的聲音,問題是如果我可以反覆調用'launch(Stage)'?我有點希望有更好的方法來做到這一點。 –

+0

PS:現在我解決了這個問題,將我遊戲中的所有* .mp3文件轉換爲* .wav,並且我使用java API而不是javaFx播放它,但它工作正常,但它變得相當沉重。 –

5

好感謝對此事我能解決我的問題@ItachiUchiha洞察力,看來使用JavaFX的任何代碼都必須從JavaFX應用程序線程中運行,但不是每一個程序必須使用JavaFX的API。總之我所做的是從Application.start(Stage ps)像左右的時間內開始我的比賽:

import javafx.application.Application; 
import javafx.stage.Stage; 

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     new Game(9,9,BasicRobot.FACING.SOUTH, 19); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     launch(); 
    } 
} 

這樣的遊戲類和一切它創建和使用可以使用JavaFX的。要播放聲音,我創建了一個utils的類:

import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 

public class Utils { 

    public static void playSound(String fileName){ 
     Media m = new Media("file:///" + System.getProperty("user.dir").replace('\\', '/') + "/" + fileName); 
     MediaPlayer player = new MediaPlayer(m); 
     player.play(); 
    } 

} 

和現在我所要做的播放聲音是從我的遊戲裏面的任何地方調用Utils.playSound("fileName.mp3")