Wie kann ich in Java FX 2 einen Warnton abspielen? Gibt es eine Möglichkeit, den Standard-Benachrichtigungston des Betriebssystems zu verwenden?
Antworten
Zu viele Anzeigen?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();
}
}
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();
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.
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.