Java FX 2 Alert sound

2019-02-13 17:14发布

How do I play an alert sound in Java FX 2? Is there a way of using the OS default notification sound?

3条回答
Bombasti
2楼-- · 2019-02-13 17:15

This is how I play sounds,

private void playMedia(Media m){
    if (m != null){
        MediaPlayer mp = new MediaPlayer(m);
        mp.play();
    }
}

public void playSomeSound(){
    try{
        Media someSound = new Media(getClass().getResource("some-sound.mp3").toString());
        playMedia(someSound);
    }catch(Exception ex){
        GeeLogger.error(getClass(), ex.getLocalizedMessage(), ex);
    }

}

Don't know about SO specifics though. Hope it helps.

查看更多
Viruses.
3楼-- · 2019-02-13 17:27

Play a sound with pure JavaFX

Simply use an instance of AudioClip. This one is very suitable for just playing single short sounds.

Play a default notification sound

Concerning Windows OS there is a way accessing properties via java.awt.Toolkit. A returned sound property is a simple Runnable which can be fired directly without any worries about sound sources etc.

Use the example below to see how both options work (you have to add 'alert.wav' to your src folder).

package audioplayer;

import java.awt.Toolkit;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class AudioPlayer extends Application {

    private static final AudioClip ALERT_AUDIOCLIP = new AudioClip(AudioPlayer.class.getResource("/alert.wav").toString());

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Scene scene = new Scene(root, 300, 250);

        Button btn = new Button();
        btn.setText("Play (My Sound)");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                AudioPlayer.ALERT_AUDIOCLIP.play();
            }
        });

        Button btn2 = new Button();
        btn2.setText("Play (Windows Default)");
        btn2.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                final Runnable runnable = (Runnable) Toolkit.getDefaultToolkit().getDesktopProperty("win.sound.default");

                if (runnable != null) {
                    runnable.run();
                }
            }
        });

        root.getChildren().add(btn);
        root.getChildren().add(btn2);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
查看更多
萌系小妹纸
4楼-- · 2019-02-13 17:33

There is currently nothing in JavaFX itself to access the OS default alert sound (you can use JavaFX to trigger on events to play back fire and forget audioclips as well as tracked media audio like mp3s).

There is an open feature request: RT-21634 (anybody can signup to view the jira).

You can beep via awt:

Toolkit.getDefaultToolkit().beep();

Printing a beep character, nicely named 007 should work according to google searches, but does not on my machine - I guess it accesses a buzzer in the machine rather than the speaker system and my machine must not have the buzzer connected or enabled.

System.out.print("\007");
System.out.flush();
查看更多
登录 后发表回答