2017-10-09 116 views
0

我想用javaFX一個接一個播放5個聲音文件。我正在努力連續兩場比賽。該代碼只播放前兩個聲音文件,然後不播放第三個聲音文件。我想能夠播放多達5個聲音文件,但沒有限制是理想的。任何幫助表示讚賞。謝謝! 我正在試着製作一個說話時鐘,告訴你時間,而且我被困在你要說話的部分。如何用javaFX播放多個連續的聲音文件?

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class MediaFX extends Application{ 


    MediaPlayer mediaplayer; 

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

    @Override 
    public void start(Stage stage){ 
     Media hello = new Media("file:///C:/Users/Good/Desktop/TimeFiles/one.wav"); 
     Media meow = new Media("file:///C:/Users/Good/Desktop/TimeFiles/oh.wav"); 
     Media neww = new Media("file:///C:/Users/Good/Desktop/TimeFiles/six.wav"); 

     mediaplayer = new MediaPlayer(hello); 
     mediaplayer.play(); 
     mediaplayer.setOnEndOfMedia(new Runnable(){ 
      @Override 
      public void run(){ 
       mediaplayer.stop(); 
       mediaplayer = new MediaPlayer(meow); 
       mediaplayer.setAutoPlay(false); 
       mediaplayer.play(); 
      } 
     }); 
     mediaplayer.setOnEndOfMedia(new Runnable(){ 
      @Override 
      public void run(){ 
       mediaplayer.stop(); 
       mediaplayer = new MediaPlayer(neww); 
       mediaplayer.setAutoPlay(false); 
       mediaplayer.play(); 
      } 
     }); 

     VBox root = new VBox(); 
     root.getChildren().addAll(); 

     Scene scene = new Scene(root,500,500); 
     stage.setScene(scene); 
     stage.show(); 
    } 

} 

回答

1

你必須找到一種方法來創建某些動作的循環,以便能夠實現你想要的。您需要:

  1. 尋找是否有被播放
  2. 創建的MediaPlayer的一個新的實例,並設置下一首歌曲
  3. 設置當前結束後,爲新的歌曲再次檢查仍然可用歌曲一。
  4. 轉到以1號

這樣做的一個很好的方法是像下面的初始化函數的遞歸調用:

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class MediaFX extends Application { 

    MediaPlayer mediaplayer; 

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

    @Override 
    public void start(Stage stage) { 
     Media hello = new Media(this.getClass().getResource("one.wav").toExternalForm()); 
     Media meow = new Media(this.getClass().getResource("two.wav").toExternalForm()); 
     Media neww = new Media(this.getClass().getResource("three.wav").toExternalForm()); 

     ObservableList<Media> mediaList = FXCollections.observableArrayList(); 
     mediaList.addAll(hello, meow, neww); 

     playMediaTracks(mediaList); 

     VBox root = new VBox(); 

     stage.setScene(new Scene(root,300,300)); 
     stage.show(); 
    } 

    private void playMediaTracks(ObservableList<Media> mediaList) { 
     if (mediaList.size() == 0) 
      return; 

     MediaPlayer mediaplayer = new MediaPlayer(mediaList.remove(0)); 
     mediaplayer.play(); 

     mediaplayer.setOnEndOfMedia(new Runnable() { 
      @Override 
      public void run() { 
       playMediaTracks(mediaList); 
      } 
     }); 
    } 

}