JAR 中的媒体播放器
Mediaplayer in JAR
此代码在 Intellij 中编译,但在 jar 中不起作用。
使用 getResourceAsStream()
或 getResource
并不能解决问题。
(我试过像 Image image = newImage(getClass().getResourceAsStream("image.png");
这样的图像,它确实有效)
package Sound;
import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.File;
/**
*/
public class TestSound extends Application{
public TestSound() {
play();
}
@Override
public void start(Stage primaryStage) throws Exception {
new TestSound().play();
}
private void play(){
String mainsound = "src/res/sound/main.mp3";
Media i = null;
i = new Media( new File(mainsound).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(i);
mediaPlayer.play();
mediaPlayer.setStopTime(new Duration(120000));
mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
}
public static void main (String[] args){
launch(args);
}
}
编辑:
Media i = new Media(getClass().getClassLoader().getResource(mainsound));
不会工作,因为构造函数需要一个字符串。
还有
Media i = new Media(getClass().getClassLoader().getResource(mainsound).toString());
new MediaPlayer(i).play();
无效。
当然是主音="res/sound/main.mp3";
用winrar解压jar后
我得到了声音字典,包括
testsound.class 和 main.mp3
还有一个包含 main.mp3 的 res 字典
两本词典同根
与其使用 getClass ().getResource (...)
不如像
这样使用它会更理想
Media m = new Media ("/myMedia.mp3");//if the media exists in default package
或
Media m = new Media ("/mypackage/myMedia.mp3");//if the media exists in mypackage
getClass().getResource("res/sound/main.mp3")
将查找与当前 class 相关的名为 res/sound/main.mp3
的资源。由于您的 class 在 sound
包中,它实际上会查找 /sound/res/sound/main.mp3
,这不是资源在您的 jar 中所在的位置。
如果显示 jar 文件中的条目列表
/sound/main.mp3
那么以下应该有效:
String mediaURL = getClass().getResource("/sound/main.mp3").toExternalForm();
// for debugging:
System.out.println(mediaURL);
Media i = new Media(mediaURL);
此代码在 Intellij 中编译,但在 jar 中不起作用。
使用 getResourceAsStream()
或 getResource
并不能解决问题。
(我试过像 Image image = newImage(getClass().getResourceAsStream("image.png");
这样的图像,它确实有效)
package Sound;
import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.File;
/**
*/
public class TestSound extends Application{
public TestSound() {
play();
}
@Override
public void start(Stage primaryStage) throws Exception {
new TestSound().play();
}
private void play(){
String mainsound = "src/res/sound/main.mp3";
Media i = null;
i = new Media( new File(mainsound).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(i);
mediaPlayer.play();
mediaPlayer.setStopTime(new Duration(120000));
mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
}
public static void main (String[] args){
launch(args);
}
}
编辑:
Media i = new Media(getClass().getClassLoader().getResource(mainsound));
不会工作,因为构造函数需要一个字符串。
还有
Media i = new Media(getClass().getClassLoader().getResource(mainsound).toString());
new MediaPlayer(i).play();
无效。
当然是主音="res/sound/main.mp3";
用winrar解压jar后 我得到了声音字典,包括 testsound.class 和 main.mp3
还有一个包含 main.mp3 的 res 字典
两本词典同根
与其使用 getClass ().getResource (...)
不如像
Media m = new Media ("/myMedia.mp3");//if the media exists in default package
或
Media m = new Media ("/mypackage/myMedia.mp3");//if the media exists in mypackage
getClass().getResource("res/sound/main.mp3")
将查找与当前 class 相关的名为 res/sound/main.mp3
的资源。由于您的 class 在 sound
包中,它实际上会查找 /sound/res/sound/main.mp3
,这不是资源在您的 jar 中所在的位置。
如果显示 jar 文件中的条目列表
/sound/main.mp3
那么以下应该有效:
String mediaURL = getClass().getResource("/sound/main.mp3").toExternalForm();
// for debugging:
System.out.println(mediaURL);
Media i = new Media(mediaURL);