如何正确设置媒体播放器javafx

如何正确设置媒体播放器javafx,java,javafx,media-player,scrollpane,pause,Java,Javafx,Media Player,Scrollpane,Pause,我创建了一个媒体播放器方法javafx,它在启动时调用(下面是媒体播放器)。我的问题是,每当我通过拖动或缩放与滚动窗格交互时,播放器就会暂停,并且不会再次启动。为什么会出现这种情况,我可以如何解决这个问题(包括完整的应用程序,如果您愿意尝试的话) 方法(实时代码) 极小的 package minimalist; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio

我创建了一个媒体播放器方法javafx,它在启动时调用(下面是媒体播放器)。我的问题是,每当我通过拖动或缩放与滚动窗格交互时,播放器就会暂停,并且不会再次启动。为什么会出现这种情况,我可以如何解决这个问题(包括完整的应用程序,如果您愿意尝试的话)

方法(实时代码)

极小的

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();
            });
        });
    }
}
包装极简主义;
导入java.io.File;
导入java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.Queue;
导入java.util.stream.collector;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.StackPane;
导入javafx.scene.media.media;
导入javafx.scene.media.MediaPlayer;
导入javafx.stage.stage;
公共类最小扩展应用程序{
私有静态队列musicList=newlinkedlist();
公共静态void main(字符串[]args)引发IOException{
列表结果=Files.find(path.get(“.\\music”),100,
(p,a)->p.toString().toLowerCase().endsWith(“.mp3”))
.map(路径->路径.toString())
.collect(Collectors.toList());
对于(int a=0;a{
mediaPlayer.play();
mediaPlayer.setOnEndOfMedia(()->{
mediaPlayer.dispose();
音乐层();
});
});
}
}

这一切似乎都表现得有些脆弱

我不建议从
main
方法启动媒体播放器。文档中有点缺少关于
MediaPlayer
的线程策略,但是由于您正在启动一个常规的JavaFX应用程序,因此遵循通常的规则并仅从JavaFX应用程序线程中调用方法似乎是明智的。在我的系统中,我无法按您设置的方式播放任何音乐

我也有零星的问题,让它开始播放后,改变了;我猜退出后可能会占用系统资源,所以我修改了代码,以确保在应用程序结束时释放播放器。在这两次更改之后,它的行为与预期一致。但是,在任何时候,我都没有任何与用户输入相关的问题;我的猜测是,这是由从主线程而不是从FX应用程序线程启动媒体播放器引起的,可能与系统有关

这是对我来说很有效的代码。我还清理了代码中的一些冗余(遍历
路径
s将它们转换为
字符串
s,然后再将其转换回
文件
s,这样您就可以转换为URL的字符串表示形式,这似乎有点迂回;在这个过程中,您还创建了一个完全不必要的列表,等等)并重新命名事物,使其遵守适当的规则:

import java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.LinkedList;
导入java.util.Queue;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.StackPane;
导入javafx.scene.media.media;
导入javafx.scene.media.MediaPlayer;
导入javafx.stage.stage;
公共类最小扩展应用程序{
private Queue musicList=new LinkedList();
私人媒体播放器;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage primaryStage)引发异常{
//每个人都应该拥有这张专辑。如果你的音乐品味不好,请编辑路径。
Files.find(path.get(System.getProperty(“user.home”),“Music/iTunes/iTunes Media/Music/Thievery Corporation/Saudade/”,100,
(p,a)->p.toString().toLowerCase().endsWith(“.m4a”))
.forEach(音乐列表::添加);
播放音乐();
ScrollPane ScrollPane=新的ScrollPane();
图像=新图像(“https://upload.wikimedia.org/wikipedia/commons/7/70/Kusatma_Zonaro.jpg");
ImageView ImageView=新的ImageView(图像);
scrollpane.setContent(imageView);
scrollpane.setPannable(true);
场景=新场景(新堆栈窗格(滚动窗格));
初级阶段。场景(场景);
primaryStage.setFullScreen(真);
primaryStage.show();
}
@凌驾
公共停车场(){
如果(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.dispose();
}
}
私人音乐{
if(musicList.peek()==null)
{
返回;
}
mediaPlayer=newmediaplayer(新媒体(musicList.poll().toUri().toString());
mediaPlayer.setOnReady(()->{
mediaPlayer.play();
mediaPl
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();
            });
        });
    }
}
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();
            });
        });

    }
}