2016-11-17 2 views
0

У меня проблема с исполнением песен. У меня есть список звуковых дорожек, загруженных из filechooser, помещенных в TableView и хранящихся в списке (игроках). getSelectionModel возьмет выбранный звуковой файл, и я запустил его, насколько это хорошо. если вы не останавливаетесь, и я выбираю другой аудиофайл и посылаю вам играть. Звуки накладываются друг на друга. Как я могу остановить выполнение предыдущего файла, избегая при этом множителя?Как предотвратить многократное воспроизведение с использованием медиапланера javafx?

код addFileAudio:

Media media; 
final List<MediaPlayer> players = new ArrayList<>(); 
String fileName; 
MediaPlayer mediaPlayer; 
public void addFileAudio(ActionEvent event) { 
      BasicFileAttributes attr = null; 
     FileChooser fileChooser = new FileChooser(); 
     fileChooser.setTitle("Seleziona il file da caricare"); 
     fileChooser.getExtensionFilters().addAll(
       new ExtensionFilter("Audio Files","*.wav","*.mp3")); 
     File selectedFile = fileChooser.showOpenDialog(new Stage()); 
     if (selectedFile != null) { 

      media = new Media(new File(selectedFile.getAbsolutePath()).toURI().toString()); 
      mediaPlayer = new MediaPlayer(media); 
      players.add(mediaPlayer); 

      MediaView mediaView = new MediaView(mediaPlayer); 
      mediaView.setMediaPlayer(mediaPlayer); 

      Path pathFile = Paths.get(selectedFile.toURI()); 
      try { 
       attr = Files.readAttributes(pathFile, BasicFileAttributes.class); 
      } catch (IOException e) { 
       Exception.showError(1); 
      } 
     }else{ 
       Exception.showWarning(0); 
     } 

     String fileName = selectedFile.getName(); 
     String data = attr.creationTime().toString().substring(0,10); 
     Table1.getItems().add(new PopulateTable(Table1.getItems().size()+1, fileName, data)); 

     } 

код кнопки воспроизведения:

void play(ActionEvent event) { 
MediaPlayer player = players.get(Table1.getSelectionModel().getSelectedIndex()); Status status = player.getStatus(); 
if (status!= Status.PLAYING) { 
player.play(); 
} else { 
MediaPlayer playerNext = players.get(Table1.getSelectionModel().getSelectedIndex()); player.stop(); playerNext.play(); } 

+0

Статус статуса не должен находиться внутри вашего метода play(). Он должен быть статичным и глобальным. Затем, как только вы нажмете play(), вы начнете воспроизводить песню, а затем установите статус на воспроизведение – Sedrick

ответ

0

Может быть что-то вроде этого: UPDATE

@FXML private ListView lvPlaylist; 


MediaPlayer player; 
Media pick; 

Status status = Status.STOPPED; 

String pathToMP3One = "song1.mp3"; 
String pathToMP3Two = "song2.mp3"; 

HashMap<String, String> hashmap = new HashMap(); 

ObservableList<String> items =FXCollections.observableArrayList(); 


@FXML 
private void handleButtonAction(ActionEvent event) { 

    switch(status) 
    { 
     case STOPPED: 

      String fileToPlay = hashmap.get(lvPlaylist.getSelectionModel().getSelectedItem().toString()); 
      System.out.println(fileToPlay); 
      pick = new Media(fileToPlay); 
      player = new MediaPlayer(pick); 
      player.play(); 
      status = Status.PLAYING; 
      break; 
     case PLAYING: 
      player.stop(); 
      fileToPlay = hashmap.get(lvPlaylist.getSelectionModel().getSelectedItem().toString()); 
      pick = new Media(fileToPlay); 
      player = new MediaPlayer(pick); 
      player.play(); 
      status = Status.PLAYING; 
      break;     
    } 
} 

@FXML 
public void addFileAudio(ActionEvent event) { 
    BasicFileAttributes attr = null; 
    FileChooser fileChooser = new FileChooser(); 
    fileChooser.setTitle("Seleziona il file da caricare"); 
    fileChooser.getExtensionFilters().addAll(new ExtensionFilter("Audio Files","*.wav","*.mp3")); 
    File selectedFile = fileChooser.showOpenDialog(new Stage()); 
    if (selectedFile != null) { 
     Path pathFile = Paths.get(selectedFile.toURI()); 
     try { 
      attr = Files.readAttributes(pathFile, BasicFileAttributes.class); 
     } catch (IOException e) { 
      System.out.println(e.toString()); 
     } 
    }else{ 
     System.out.println("hello"); 
    } 

    hashmap.put(selectedFile.getName(), selectedFile.toURI().toString());  
    System.out.println("File name: " + selectedFile.getName()); 
    lvPlaylist.getItems().add(selectedFile.getName()); 

    } 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
    lvPlaylist.setItems(items); 

} 

Это сработало для меня!

+0

спасибо, но метод setStatus дал мне ошибку: метод setStatus из типа MediaPlayer не отображается Что вы мне предлагаете? – Margherita

+0

Я предполагаю, что у вас есть метод setStatus(). Просто избавьтесь от player.setStatus(); часть. У вас есть player.getStatus(); поэтому я предположил, что у вас должен быть player.setStatus(); Сожалею. Если у вас нет player.setStatus(), как вы изменяете статус игрока. Зачем использовать player.getStatus, если он всегда один и тот же. – Sedrick

+0

На самом деле я не могу изменить значение только для его принятия. У меня есть метод statusProperty(), но я не могу понять, действительно ли это в моем случае. Вы также можете использовать только СТАТУС. (Остановлен/приостановлен/играет ...) – Margherita

Смежные вопросы