所以我的代码只是复制粘贴:
import javafx.scene.media.*;
class Gui {
public static void main(String[] args) {
try{
Media hit = new Media("skin.mp3");
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();
}catch(Exception e){
e.printStackTrace();
}
}
}
我得到的例外是:
java.lang.IllegalArgumentException: uri.getScheme() == null!
at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:217)
at javafx.scene.media.Media.<init>(Media.java:364)
at Gui.main(gui.java:6)
我正在编译&amp;正确运行它,即在类路径中包含jfxrt.jar
文件
注意:我只是使用记事本而不是任何IDE。
所以有人可以告诉我IllegalArgumentException
Thankx
更新:使用file://e:/skin.mp3
它运行正常,但又给我留下了另一个例外:
MediaException: MEDIA_INACCESSIBLE : e
at javafx.scene.media.Media.<init>(Unknown Source)
at Gui.main(gui.java:6)
所以,如果你能对这个例外有所了解。
顺便说一下,我检查了这首歌,它没有腐败,因为它在vlc中播放得很好。
答案 0 :(得分:5)
来自JavaFX API文档
- 提供的URI必须符合java.net.URI。
所要求的RFC-2396- 仅支持HTTP,FILE和JAR URI。
因此,我怀疑从阅读文档时,您需要提供URI路径。
像file://path/to/file/skin.mp3
这样的东西可能会有用。
答案 1 :(得分:4)
此问题中的代码存在一些问题。
即使问题有一个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规范中有一些我不理解的东西,这意味着你不要在协议之后需要//。
file:/C:/Users/Public/Music/skin.mp3
检查文件uri的某种方法是有效的,询问文件是否存在
System.out.println("File " + filename + " exists? " + new File(filename).exists());
在您知道文件uri有效后,您可以使用。
将其转换为字符串file.toURI().toURL().toExternalForm()
这是一个简短的示例程序,用于使用MediaPlayer在JavaFX中播放一些音频并进行一些错误处理,以便在出现问题时更容易理解。
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;
}
}
以下链接指向plays all of the mp3 files in a given directory sequentially的JavaFX 2.x媒体播放器的其他示例。