我有一个使用Gradle文件构建的JavaFX项目,我用IntelliJ编写所有内容。在其中,我使用 javafx.scene.media.Media 和 javafx.scene.media.MediaPlayer 播放一些音乐。
public SoundPlayer(String filename) {
String soundLocation = "\\src\\main\\resources\\sound\\" + fileName;
String absolute = new File("").getAbsolutePath() + soundLocation;
System.out.println(absolute);
Media soundMedia = new Media(new File(absolute).toURI().toString());
mediaPlayer = new MediaPlayer(soundMedia);
}
字符串
我一直在工作的项目目录是:
简体中文
|-main/
|---|-java/
|---|---|---sound.SoundPlayer
|---|- 资源
|---|---|- 声音/
|---|---|---|---click.mp3
|---|---|---|---bgm.mp3
然而,当我去编译并将其转换为一个JavaScript文件时,Gradle将目录更改为这个(在JavaScript文件中,顶级):
声音/
|---SoundPlayer.class
|---click.mp3
|---bgm.mp3
这使得它抛出一个Media Exception:MEDIA UNAVAILABLE。我尝试将文件更改为以下两种:
Media soundMedia = new Media(new File("sound\\" + fileName).toURI().toString());
型
和
Media soundMedia = new Media(new File(fileName).toURI().toString());
型
……但我总是得到同样的例外。怎么回事?
1条答案
按热度按时间klr1opcd1#
Gradle所做的完全在意料之中。src/main/java和src/main/resources目录分别存储代码和资源。resources文件夹包含所有非Java代码,如图像,声音等。
创建xml文件时,resources目录的内容将按原样复制(保持包结构)。注意,click.mp3和bgm.mp3是sound包的成员。
所以,当你想加载一个资源时,它(通常)不应该使用文件路径来完成。而是使用,包结构来完成。在这里,由于声音和
SoundPlayer
具有相同的包,即sound
,你可以使用SoundPlayer
类来加载资源,如下所示:字符串
关于Javadocs
public String toExternalForm()构造此URL的字符串表示。该字符串是通过调用此对象的流协议处理程序的toExternalForm方法创建的。
本质上,toExternalForm()函数为给定资源创建适当的URL。
下面是一个完整的例子。
型
以及修改后的SoundPlayer
型
和Main类来使用SoundPlayer
型