我对使用 JavaFX 和 Webview 很陌生。我想要做的是当网络引擎的地址(我假设这是通过 webengine.getLocation() 访问)更改为特定的网址以触发事件,即播放声音文件。不过,我有点不知道从哪里开始。任何帮助,将不胜感激!
问问题
940 次
1 回答
1
一般的做法
如果你只想打一个ping!在导航到特定位置时(例如,每次有人去以“ http://www.google.com ”开头的某个地方时),编写WebEngine位置更改侦听器来播放这样的AudioClip:
final AudioClip ping = new AudioClip(
"http://soundbible.com/grab.php?id=1815&type=wav"
);
webView.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observable, String oldLocation, String newLocation) {
if (newLocation != null && newLocation.startsWith("http://www.google.com") {
ping.play();
}
}
});
一般来说,对于这种情况,音频剪辑首选像未压缩的 wav 这样的格式,因为无论如何 ping 可能非常小,并且 wav 文件将在所有 JavaFX 目标平台上播放,而无需安装额外的音频编解码器库。
示例应用程序
这是一个迷你网络浏览器示例应用程序,使用WebView
它可以 ping!
- 一平!每次加载新页面时都会发出声音。
- 同一页面上的锚导航不算作新页面。
- 应用程序中使用的 ping 声音是公共领域的,可从以下网址下载:http ://soundbible.com/grab.php?id=1815&type=wav
- 您应该下载并使用 ping 的本地版本!如果您想在实际应用程序中使用它,请发出声音。
只需在位置文本字段中输入您要访问的地址,按 Enter,然后在加载页面时听到它发出的 ping 声。
TheMachineThatGoesPing.java
import javafx.application.Application;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.media.AudioClip;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class TheMachineThatGoesPing extends Application {
private static final String HOME_LOC =
"http://en.wikiquote.org/wiki/Monty_Python's_The_Meaning_of_Life";
private WebView webView;
private AudioClip ping;
public static void main(String[] args) { Application.launch(TheMachineThatGoesPing.class); }
@Override
public void init() throws Exception {
ping = new AudioClip("http://soundbible.com/grab.php?id=1815&type=wav");
}
@Override public void start(Stage stage) throws Exception {
webView = new WebView();
webView.setPrefWidth(1000);
final TextField location = new TextField();
location.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (!location.getText().startsWith("http")) {
location.setText("http://" + location.getText());
}
webView.getEngine().load(location.getText());
}
});
webView.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observable, String oldLocation, String newLocation) {
location.setText(newLocation);
ping.play();
}
});
webView.getEngine().load(HOME_LOC);
VBox layout = new VBox(10);
layout.setStyle("-fx-padding: 10; -fx-background-color: cornsilk;");
layout.getChildren().setAll(
location,
webView
);
stage.setTitle("The machine that goes 'ping!'");
stage.setScene(new Scene(layout));
stage.show();
}
}
于 2013-05-23T06:25:44.093 回答