10 Stimmen

Java FX 2 Warnton

Wie kann ich in Java FX 2 einen Warnton abspielen? Gibt es eine Möglichkeit, den Standard-Benachrichtigungston des Betriebssystems zu verwenden?

11voto

pmoule Punkte 4272

Einen Ton mit reinem JavaFX abspielen

Verwenden Sie einfach eine Instanz von AudioClip . Dieser ist sehr gut geeignet, um einzelne kurze Töne zu spielen.

Abspielen eines Standard-Benachrichtigungstons

Für das Windows-Betriebssystem gibt es eine Möglichkeit, auf die Eigenschaften über java.awt.Toolkit . Eine zurückgegebene Klangeigenschaft ist eine einfache Runnable die direkt abgefeuert werden können, ohne sich um Schallquellen usw. kümmern zu müssen.

Anhand des folgenden Beispiels können Sie sehen, wie beide Optionen funktionieren (Sie müssen "alert.wav" zu Ihrem src-Ordner hinzufügen).

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();
    }
}

11voto

jewelsea Punkte 139897

In JavaFX selbst gibt es derzeit keine Möglichkeit, auf den Standard-Warnton des Betriebssystems zuzugreifen (Sie können JavaFX verwenden, um Ereignisse auszulösen, die Audioclips von "Fire and Forget" sowie verfolgte Audiomedien wie mp3s wiedergeben).

Es gibt eine offene Funktionsanfrage: RT-21634 (jeder kann sich anmelden, um das Jira einzusehen).

Sie können über awt piepsen:

Toolkit.getDefaultToolkit().beep();

Das Drucken eines Piepszeichens mit dem schönen Namen 007 sollte laut Google-Suche funktionieren, tut es aber nicht auf meinem Gerät - ich vermute, dass es auf einen Summer im Gerät zugreift und nicht auf das Lautsprechersystem, und mein Gerät muss den Summer nicht angeschlossen oder aktiviert haben.

System.out.print("\007");
System.out.flush();

6voto

alscu Punkte 928

So spiele ich Klänge,

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);
    }

}

Ich weiß allerdings nicht, wie es sich mit SO verhält. Hoffentlich hilft es.

0voto

Basil Bourque Punkte 256611

Toolkit.getDefaultToolkit().beep()

Das ist ganz einfach: Rufen Sie an. Toolkit.getDefaultToolkit().beep() um den Standard-Piepton der Host-Plattform abzuspielen.

Button beepButton = new Button( "Beep" );
beepButton.setOnAction( ( ActionEvent event ) -> {
    Toolkit.getDefaultToolkit().beep();
} );

Das funktioniert in Java 19 mit JavaFX/OpenJFX 19 auf macOS. Ich gehe davon aus, dass es auch auf anderen Plattformen funktioniert, obwohl ich es nicht getestet habe.


Credits: Ich fand diese Information auf diese Antwort über Java im Allgemeinen. Und dieser Ansatz wird in der Antwort von jewelsea auf dieser Seite; ich habe versucht, seine Verwendung hier deutlicher zu machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X