2016-10-26 3 views
2

Ich habe eine Media Player Methode erstellt, die javafx heißt, die beim Start aufgerufen wird (unten ist der Media Player). Mein Problem ist, dass das immer dann pausiert, wenn ich mit einem Scroll-Fenster durch Ziehen oder Zoomen interagiere, den Player pausiert und nicht neu startet. Warum ist das der Fall und wie kann ich das beheben (inklusive vollständiger Anwendung, wenn Sie es versuchen würden).Wie ordne ich einen Media Player richtig an? Javafx

Methode (Live-Code)

private static void MusicPlayer() { 
    if(musicList.peek() == null) 
    { 
     return; 
    } 
    MediaPlayer mediaPlayer = new MediaPlayer(new Media(new File(musicList.poll()).toURI().toString())); 
    mediaPlayer.setOnReady(() -> { 
     mediaPlayer.play(); 
     mediaPlayer.setOnEndOfMedia(() -> { 
      mediaPlayer.dispose(); 
      MusicPlayer(); 
     }); 
    }); 
} 

Minimal

package minimalist; 

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Queue; 
import java.util.stream.Collectors; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class Minimal extends Application{ 

    private static Queue<String> musicList = new LinkedList<String>(); 

    public static void main(String[] args) throws IOException { 
     List<String> result = Files.find(Paths.get(".\\music"), 100, 
       (p, a) -> p.toString().toLowerCase().endsWith(".mp3")) 
       .map(path -> path.toString()) 
       .collect(Collectors.toList()); 
     for(int a = 0; a < result.size(); a++) 
     { 
      musicList.add(result.get(a)); 
     } 
     MusicPlayer(); 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     ScrollPane scrollpane = new ScrollPane(); 
     Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/7/70/Kusatma_Zonaro.jpg"); 
     ImageView imageView = new ImageView(image); 
     scrollpane.setContent(imageView); 
     scrollpane.setPannable(true); 
     Scene scene = new Scene(new StackPane(scrollpane)); 
     primaryStage.setScene(scene); 
     primaryStage.setFullScreen(true); 
     primaryStage.show(); 
    } 

    private static void MusicPlayer() { 
     if(musicList.peek() == null) 
     { 
      return; 
     } 
     MediaPlayer mediaPlayer = new MediaPlayer(new Media(new File(musicList.poll()).toURI().toString())); 
     mediaPlayer.setOnReady(() -> { 
      mediaPlayer.play(); 
      mediaPlayer.setOnEndOfMedia(() -> { 
       mediaPlayer.dispose(); 
       MusicPlayer(); 
      }); 
     }); 
    } 
} 
+0

Werfen sie einen Blick hier https://docs.oracle.com/javafx/2/media/playercontrol.htm. Adam der Code, den Sie anbieten, ist zu groß .. versuchen Sie, die Position zu finden, wo der Fehler herkommt, also können wir eine Lösung anbieten. Versuchen Sie auch, Ihr Projekt mit fxml zu bauen, das viel Ihren Hauptcode verringert. – GOXR3PLUS

+0

Sie haben versucht, dies [vorher] zu fragen (http://stackoverflow.com/questions/39969156/music-player-pauses-upon-interaction-with-interface-javafx). Es würde wirklich helfen, wenn Sie [MCVE] dafür erstellen würden: Ihr erster Versuch zu fragen enthielt keinen * vollständigen * Code; der Code in dieser Frage ist sicherlich nicht * minimal * (und ist auch nicht wirklich vollständig, da er von Ressourcen abhängt, die wir nicht haben). Erstelle also ein neues Projekt, das * nur * den Code zum Abspielen von Musik und etwas zum Ziehen hat, um zu sehen, ob du das Problem reproduzieren kannst. Dann posten Sie die kleinste vollständige Anwendung, die das Problem zeigt. –

+0

@ GoXR3Plus Ja, ich habe mir das angesehen, bevor ich das gepostet habe und es war nicht besonders nützlich. Im Folgenden habe ich ein minimales alles, was Sie tun müssen, ist ein Projekt erstellen und einen Quellordner namens Musik hinzufügen, die MP3-Dateien enthält. –

Antwort

2

Das alles scheint in so etwas wie eine fragile Weise zu verhalten.

Ich würde nicht empfehlen, den Media Player von der main Methode zu starten. Der Dokumentation fehlt ein wenig die Threading-Richtlinie für MediaPlayer, aber da Sie eine reguläre JavaFX-Anwendung starten, erscheint es sinnvoll, die üblichen Regeln zu befolgen und nur Methoden aus dem JavaFX-Anwendungs-Thread aufzurufen. Auf meinem System konnte ich keine Musik spielen, so wie Sie sie eingerichtet hatten.

Ich hatte auch sporadische Probleme, es zu beginnen zu spielen, nachdem ich das geändert habe; Ich vermutete, dass ich Systemressourcen nach dem Beenden gebunden ließ, also änderte ich den Code, um sicherzustellen, dass der Player entsorgt wurde, als die Anwendung beendet wurde. Nach diesen beiden Änderungen verhielt es sich wie erwartet. Zu keinem Zeitpunkt hatte ich Probleme mit der Benutzereingabe. Meine Vermutung ist, dass diese dadurch verursacht werden, dass der Media Player vom Hauptthread statt vom FX Application Thread gestartet wird und wahrscheinlich systemabhängig ist.

Hier ist der Code, der für mich in Ordnung war. Ich habe auch einige der Redundanz in Ihrem Code bereinigt (Iterieren durch Path s, um sie in String s konvertieren, die Sie dann wieder in File s konvertieren, so dass Sie in eine Zeichenfolge Darstellung einer URL konvertieren kann etwas umständlich, Sie erstellen auch eine vollständig unnötige Liste in diesem Prozess, usw.) und die Dinge umbenannt, so dass es durch die richtige naming conventations bleibt):

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.LinkedList; 
import java.util.Queue; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.Stage; 

public class Minimal extends Application{ 

    private Queue<Path> musicList = new LinkedList<>(); 

    private MediaPlayer mediaPlayer ; 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     // Everyone should have this album. Edit the path if your musical taste is poor. 
     Files.find(Paths.get(System.getProperty("user.home"),"Music/iTunes/iTunes Media/Music/Thievery Corporation/Saudade/"), 100, 
       (p, a) -> p.toString().toLowerCase().endsWith(".m4a")) 
       .forEach(musicList::add); 

     playMusic(); 

     ScrollPane scrollpane = new ScrollPane(); 
     Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/7/70/Kusatma_Zonaro.jpg"); 
     ImageView imageView = new ImageView(image); 
     scrollpane.setContent(imageView); 
     scrollpane.setPannable(true); 
     Scene scene = new Scene(new StackPane(scrollpane)); 
     primaryStage.setScene(scene); 
     primaryStage.setFullScreen(true); 
     primaryStage.show(); 

    } 

    @Override 
    public void stop() { 
     if (mediaPlayer != null) { 
      mediaPlayer.stop(); 
      mediaPlayer.dispose(); 
     } 
    } 

    private void playMusic() { 
     if(musicList.peek() == null) 
     { 
      return; 
     } 
     mediaPlayer = new MediaPlayer(new Media(musicList.poll().toUri().toString())); 
     mediaPlayer.setOnReady(() -> { 
      mediaPlayer.play(); 
      mediaPlayer.setOnEndOfMedia(() -> { 
       mediaPlayer.dispose(); 
       playMusic(); 
      }); 
     }); 

    } 
} 
+0

Ja, das hat funktioniert, obwohl ich anscheinend einen schlechten Musikgeschmack habe ...Früher habe ich versucht, den Code auf die Startmethode zu verschieben, aber es hat nichts geändert, als ich es ausprobiert habe, also habe ich es zurück zur Hauptmethode verschoben. –