下面列出了javafx.scene.web.WebErrorEvent#javafx.scene.web.WebEvent 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void start(final Stage stage) throws Exception {
stage.setTitle("Pokemate UI");
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(0);
});
//This needs to be set to the resources directory, however, it is not play along nicely.
mapComponent = new GoogleMapView("/map.html");
mapComponent.addMapInializedListener(this);
mapComponent.getWebview().getEngine().setOnAlert((WebEvent<String> event) -> {
});
BorderPane bp = new BorderPane();
bp.setCenter(mapComponent);
Scene scene = new Scene(bp);
stage.setScene(scene);
stage.setWidth(1100);
stage.setHeight(674);
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
stage.getIcons().add(new Image(classloader.getResourceAsStream("icon.png")));
stage.show();
}
private void initPicker(WebView webView) {
// attach a handler for an alert function call which will set the DatePicker's date property.
webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>() {
@Override public void handle(WebEvent<String> event) {
try { date.set(jQueryUiDateFormat.parse(event.getData())); } catch (ParseException e) { /* no action required */ }
}
});
// place the webView holding the jQuery date picker inside this node.
this.getChildren().add(webView);
// monitor the date for changes and update the formatted date string to keep it in sync.
date.addListener(new ChangeListener<Date>() {
@Override public void changed(ObservableValue<? extends Date> observableValue, Date oldDate, Date newDate) {
dateString.set(dateFormat.format(newDate));
}
});
// workaround as I don't know how to size the stack to the size of the enclosed WebPane's html content.
this.setMaxSize(330, 280);//307, 241);
}
@Override
public void start(final Stage stage) throws Exception {
mapComponent = new GoogleMapView();
mapComponent.addMapInitializedListener(this);
mapComponent.setDisableDoubleClick(true);
mapComponent.getWebview().getEngine().setOnAlert((WebEvent<String> event) -> {
// System.out.println("Event event: " + event);
});
BorderPane bp = new BorderPane();
bp.setCenter(mapComponent);
Scene scene = new Scene(bp);
stage.setScene(scene);
stage.show();
}
private void createWebView(Stage primaryStage, String page) {
// create the JavaFX webview
final WebView webView = new WebView();
// connect the FruitsService instance as "fruitsService"
// javascript variable
connectBackendObject(
webView.getEngine(),
"fruitsService", new FruitsService());
// connect the CalculatorService instance as "calculatorService"
// javascript variable
connectBackendObject(
webView.getEngine(),
"calculatorService", new CalculatorService());
// show "alert" Javascript messages in stdout (useful to debug)
webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>(){
@Override
public void handle(WebEvent<String> arg0) {
System.err.println("alertwb1: " + arg0.getData());
}
});
// load index.html
webView.getEngine().load(
getClass().getResource(page).
toExternalForm());
primaryStage.setScene(new Scene(webView));
primaryStage.setTitle("WebView with Java backend");
primaryStage.show();
}
private AlertEventHandlerWrapper(
WebEngine engine,
EventHandler<WebEvent<String>> wrappedHandler) {
this.engine = engine;
this.wrappedHandler = wrappedHandler;
}
@Override
public void handle(WebEvent<String> arg0) {
if (arg0.getData().contains(CONNECT_BACKEND_MAGIC_WORD)) {
String varname = arg0.getData().substring(
CONNECT_BACKEND_MAGIC_WORD.length());
connectToWebEngine(engine, varname);
}
else if (wrappedHandler != null) wrappedHandler.handle(arg0);
}
protected void handleStatusChange(WebEvent<String> ev)
{
statusField.setText(ev.getData());
}
public void setOnAlert(EventHandler<WebEvent<String>> eventHandler) {
webEngine.setOnAlert(eventHandler);
}
/**
* Registers a backend Java object as a Javascript variable.
* The real connection to the webEngine comes when the javascript performs
* an special "alert" message by invoking
* "alert('__CONNECT__BACKEND__varname')" where varname is the javascript
* variable we want to make available.
*
* The call to this function has to be performed before the engine loads the
* first page (where the alert call should take place).
*
* @param webEngine The webEngine to register the new variable.
* @param varname The name of the variable in javascript.
* @param backend The Java backend object.
*/
public static void connectBackendObject(
final WebEngine webEngine,
final String varname,
final Object backend) {
registerBackendObject(webEngine, varname, backend);
// create a onAlertChangeListener. We always want to listen
// to onAlert events, since via this event, the javascript front-end
// will send us an special "alert" message asking to connect the
// backend object as soon as possible(*).
// However, if the programmer also wants to set
// his own onAlert handler for this web engine,
// we will create a handlerwrapper with our
// behavior plus the programmer's one.
// (*) It was impossible for me to re-connect the backend object
// when the users navigates from one page to another page where the
// backend object was also needed. The navigation erases any javascript
// variables, so the backend has to be reconnected. However,
// The recommended state change listeners on
// webEngine were executed too late, after javascript code asking for the
// backend object is executed, so it was not a solution.
// The only way I found is to place a custom javacript "signaling"
// code to ask Java to reconnect the backend object.
// The solution was "alert", because we can listen to alert calls from
// javascript, so via an special "alert" message, we can connect the
// backend object again.
// It is not a bad solution, because the programmer has only to inlude
// a simple additional script (such as "mybackend.js") in the page
// before any other scripts uses the backend variable.
if (!webEnginesWithAlertChangeListener.contains(webEngine)) {
if (webEngine.getOnAlert() == null) {
webEngine.setOnAlert(new AlertEventHandlerWrapper(webEngine,
null));
}
webEngine.onAlertProperty().addListener(
new ChangeListener<EventHandler<WebEvent<String>>>() {
@Override
public void changed(
ObservableValue
<? extends EventHandler<WebEvent<String>>> arg0,
EventHandler<WebEvent<String>> previous,
final EventHandler<WebEvent<String>> newHandler) {
if (!changing) { // avoid recursive calls
changing = true;
webEngine.setOnAlert(
new AlertEventHandlerWrapper(
webEngine,
newHandler));
changing = false;
}
}
});
}
webEnginesWithAlertChangeListener.add(webEngine);
}