JavaFX:点击某些内容时播放声音

时间:2017-05-31 01:04:48

标签: java audio javafx

我目前在这里有我的EventHandler:

theScene.setOnMouseClicked(
            new EventHandler<MouseEvent>() {
                public void handle(MouseEvent e) {
                    if (targetData.containsPoint(e.getX(), e.getY())) {
                        double x = 50 + 400 * Math.random();
                        double y = 50 + 400 * Math.random();
                        targetData.setCenter(x, y);
                        mediaPlayer.play(); //play hitsound
                        points.value++; //add points
                    } else {
                        points.value = 0; //miss
                    }
                }
            });

我也有这样的音频设置:

    String hitNormal = ("hit.mp3");
    Media sound = new Media(new File(hitNormal).toURI().toString());
    MediaPlayer mediaPlayer = new MediaPlayer(sound);

当我运行程序时,只有第一次点击圆圈才能播放hitsound,但以下所有圆圈都不播放声音。我认为上面的内容应该有效,因为每次点击其他圆圈时,它总是会增加分数。因为我有我的mediaPlayer.play();在完全相同的if语句中作为添加分数的行,我期望声音也可以播放。每次点击圆圈时如何让我的hitsound发挥?

编辑:我添加了mediaPlayer.stop();在points.value ++之下,似乎偶尔会播放hitsound但并非总是如此。

2 个答案:

答案 0 :(得分:2)

在问题评论中你提到音频只有一秒钟。如果使用AudioClip的情况可能比Media / MediaPlayer更适合您的需求。

AudioClip不同,MediaPlayer可以多次并行播放(允许多次快速点击一次播放声音)。它也可以根据需要多次播放而不会有太多麻烦。

如果坚持使用MediaPlayer James_D并且TomN似乎在正确的轨道上。从一些小测试开始,MediaPlayer在到达媒体结束后似乎不会在您拨打play()时重新启动。这样做的原因是,当媒体播放完毕后,Status的{​​{1}}不会从MediaPlayer更改为PLAYING。由于STOPPEDplay()Status时无效,因此PLAYING无法重启。

要解决此问题,您必须先使用seek(Duration.ZERO)将时间设置为0,然后调用play()。事实上,如果您之前未曾在任何地方拨打play()pause(),那么在第一次调用stop()之后似乎没有必要。

但是,由于您的音频只有一秒钟,我仍然建议使用AudioClip。本课程的设计正是为了您所能做的事情。

答案 1 :(得分:0)

您需要检查媒体播放器的状态,此方法可能有助于mediaPlayer.getStatus()

当它正在播放时,另一个play()方法似乎什么也不做,因为它将状态改为播放但已经有了。请参阅MediaPlayerMediaPlayer.Status

尝试在代码中使用以下方法。

mediaPlayer.stop()它将停止媒体并将当前时间重置为零。

媒体结束时添加此方法。您可以尝试以下代码

mediaPlayer.setOnEndOfMedia(new Runnable() 
{
    public void run() 
    {
        mediaPlayer.stop();
    }
});

或使用mediaPlayer.seek()寻求当前时间。

当之前的媒体尚未到达结束时,您需要暂停它并在下一个play()之前将当前时间设为零。