这个问题的代码有一些问题。
- 课程需要公开。
- JavaFX 2 应用程序需要扩展 Application 类。
- JavaFX 2 应用程序应该定义一个启动方法。
- 正在创建的媒体的定位器应该是 MadProgrammer 指出的完整 URI。
即使这个问题有一个 javafx-2 标记,我想知道它是否是为 JavaFX 1.x JavaFX Script(现在是一种不受支持的编程语言并且与 JavaFX 2 不兼容)编写的。如果是这样,我建议使用 Java 编码并为此使用 JavaFX 2.x 而不是 JavaFX Script。
在 Windows 上,URI 的绝对定位符的文件表示在文件协议之后有三个斜杠。例如,以下是有效的:
file:///C:/Users/Public/Music/skin.mp3
出于某种原因,一个斜杠也可以工作(我猜在内部 Java 会为文件上的协议说明符插入额外的 // 或者可能在 URL 规范中有一些我不理解的东西,这意味着你不需要// 在协议之后)。
文件:/C:/Users/Public/Music/skin.mp3
检查文件 uri 的一种方法是询问文件 uri 是否存在
System.out.println("文件" + 文件名 + " 存在吗?" + new File(filename).exists());
在您知道您的文件 uri 有效后,您可以使用将其转换为字符串。
file.toURI().toURL().toExternalForm()
这是一个简短的示例程序,用于在 JavaFX 中使用带有一点错误处理的 MediaPlayer 播放一些音频,以便在出现问题时更容易理解。
import java.io.File;
import java.net.MalformedURLException;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.media.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/** plays an audio in JavaFX 2.x */
public class SimpleAudioPlayer extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) throws MalformedURLException {
final Label status = new Label("Init");
MediaPlayer mediaPlayer = createMediaPlayer(
"C:/Users/Public/Music/Sample Music/Future Islands - Before the Bridge.mp3",
status
);
StackPane layout = new StackPane();
layout.getChildren().addAll(status);
stage.setScene(new Scene(layout, 600, 100, Color.CORNSILK));
stage.show();
if (mediaPlayer != null) {
mediaPlayer.play();
}
}
/**
* creates a media player using a file from the given filename path
* and tracks the status of playing the file via the status label
*/
private MediaPlayer createMediaPlayer(final String filename, final Label status) throws MalformedURLException {
File file = new File(filename);
if (!file.exists()) {
status.setText("File does not exist: " + filename);
}
final String mediaLocation = file.toURI().toURL().toExternalForm();
Media media = new Media(mediaLocation);
MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.setOnError(new Runnable() {
@Override public void run() {
status.setText("Error");
}
});
mediaPlayer.setOnPlaying(new Runnable() {
@Override public void run() {
status.setText("Playing: " + mediaLocation);
}
});
mediaPlayer.setOnEndOfMedia(new Runnable() {
@Override public void run() {
status.setText("Done");
}
});
return mediaPlayer;
}
}
这是一个指向 JavaFX 2.x 媒体播放器的附加示例的链接,该播放器按顺序播放给定目录中的所有 mp3 文件。