我有一首歌一直在播放。我想在鼠标悬停在按钮上时添加更多声音,悬停时有声音的方法有效,但没有声音,只播放主歌曲。下面的代码示例。
App.java
public class App extends Application {
private static Scene scene;
private static MediaPlayer mediaPlayer;
private static Media media;
private String backSongURL = "path mp3";
final int sizeW = 640;
final int sizeH = 480;
@Override
public void start(@SuppressWarnings("exports") Stage stage) throws IOException {
scene = new Scene(loadFXML("main"), sizeW, sizeH);
stage.setScene(scene);
stage.show();
BackMusic();
}
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public void BackMusic() { // add music to background
media = new Media(new File(backSongURL).toURI().toString());
mediaPlayer = new MediaPlayer(media);
mediaPlayer.setCycleCount(999999999);
mediaPlayer.setVolume(0.2);
mediaPlayer.setAutoPlay(true);
}
public static void main(String[] args) {
launch();
}
}
主控制器(或菜单)
@FXML
public void btnSong() {
media = new Media(new File(btnSongURL).toURI().toString());
mediaPlayer = new MediaPlayer(media);
mediaPlayer.setVolume(0.9);
mediaPlayer.stop();
}
btnSongs方法如果你运行调试看看一切都没有问题,但是按键上没有声音。为了对界面和代码绑定进行建模,我使用了 SceneBuilder
按钮歌曲实际上是长歌还是短音?
短音频
AudioClip
。
上面的链接用于在按下鼠标时播放声音,按下按钮时会在按钮操作处理程序而不是鼠标事件处理程序中播放音频。
长音频
如果是长歌曲,您需要调用
mediaPlayer.play()
来开始播放媒体,而不是 mediaPlayer.stop()
(这是您在问题代码中调用的内容)。
只要您在不同的媒体播放器中播放声音并在播放声音时保留对媒体播放器的引用,那么您可以一次播放多个声音而不会出现任何问题。
您可能希望将媒体和播放器缓存在与背景音乐不同的变量中,这样在音频完成播放之前,其中之一就不会被过早地垃圾收集。
您还希望预先加载媒体一次,而不是每次播放时加载,否则会出现延迟。对于背景音乐,启动媒体时的延迟可能是可以的,但对于声音与按下按钮一致的延迟来说并不理想。
Oracle 提供了完整的使用 MediaPlayer 的教程。 Oracle 教程很旧并且适用于 Java 8,但大部分代码都很好。对于现代 JavaFX 版本,您还需要 需要 javafx.media 模块才能使用它。
正如提问者在评论中指出的:
您的修复有效