如何正确设置媒体播放器javafx
我创建了一个媒体播放器方法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
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();
});
});
}
}