javafx
WebView e WebEngine
Ricerca…
Osservazioni
WebView
è il nodo JavaFX che è integrato nell'albero dei componenti JavaFX. Gestisce un WebEngine
e ne mostra il contenuto.
Il WebEngine
è il motore di WebEngine
sottostante, che fondamentalmente fa tutto il lavoro.
Caricamento di una pagina
WebView wv = new WebView();
WebEngine we = wv.getEngine();
we.load("https://stackoverflow.com");
WebView
è la shell dell'interfaccia utente di WebEngine
. Quasi tutti i controlli per l'interazione non dell'interfaccia utente con una pagina vengono eseguiti tramite la classe WebEngine
.
Ottieni la cronologia delle pagine di una WebView
WebHistory history = webView.getEngine().getHistory();
La cronologia è fondamentalmente una lista di voci. Ogni voce rappresenta una pagina visitata e fornisce l'accesso alle informazioni sulla pagina rilevanti, come l'URL, il titolo e la data di ultima visita della pagina.
L'elenco può essere ottenuto utilizzando il metodo getEntries()
. La cronologia e l'elenco di voci corrispondente cambiano man WebEngine
che WebEngine
naviga sul Web. L'elenco può espandersi o restringersi in base alle azioni del browser. Queste modifiche possono essere ascoltate dall'API ObservableList che l'elenco espone.
L'indice della voce della cronologia associata alla pagina attualmente visitata è rappresentato da currentIndexProperty()
. L'indice corrente può essere utilizzato per navigare a qualsiasi voce nella cronologia utilizzando il metodo go(int)
. maxSizeProperty()
imposta la dimensione massima della cronologia, che è la dimensione dell'elenco cronologico
Di seguito è riportato un esempio di come ottenere ed elaborare l'elenco degli elementi della cronologia Web .
Un ComboBox
(comboBox) viene utilizzato per memorizzare gli elementi della cronologia. Usando ListChangeListener
su WebHistory
il ComboBox
viene aggiornato alla WebHistory
corrente. Sul ComboBox
è un EventHandler
che reindirizza alla pagina selezionata.
final WebHistory history = webEngine.getHistory();
comboBox.setItems(history.getEntries());
comboBox.setPrefWidth(60);
comboBox.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent ev) {
int offset =
comboBox.getSelectionModel().getSelectedIndex()
- history.getCurrentIndex();
history.go(offset);
}
});
history.currentIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
// update currently selected combobox item
comboBox.getSelectionModel().select(newValue.intValue());
}
});
// set converter for value shown in the combobox:
// display the urls
comboBox.setConverter(new StringConverter<WebHistory.Entry>() {
@Override
public String toString(WebHistory.Entry object) {
return object == null ? null : object.getUrl();
}
@Override
public WebHistory.Entry fromString(String string) {
throw new UnsupportedOperationException();
}
});
inviare avvisi JavaScript dalla pagina Web visualizzata al log delle applicazioni Java.
private final Logger logger = Logger.getLogger(getClass().getCanonicalName());
WebView webView = new WebView();
webEngine = webView.getEngine();
webEngine.setOnAlert(event -> logger.warning(() -> "JS alert: " + event.getData()));
Comunicazione tra app Java e Javascript nella pagina web
Quando si utilizza una WebView per visualizzare la propria pagina Web personalizzata e questa pagina Web contiene Javascript, potrebbe essere necessario stabilire una comunicazione bidirezionale tra il programma Java e Javascript nella pagina Web.
Questo esempio mostra come impostare una tale comunicazione.
La pagina web deve visualizzare un campo di immissione e un pulsante. Facendo clic sul pulsante, il valore dal campo di input viene inviato all'applicazione Java, che lo elabora. Dopo l'elaborazione, un risultato viene inviato al Javascript che a sua volta visualizza il risultato sulla pagina web.
Il principio di base è che per la comunicazione da Javascript a Java viene creato un oggetto in Java che viene impostato nella pagina web. E per l'altra direzione, un oggetto viene creato in Javascript ed estratto dalla pagina web.
Il codice seguente mostra la parte Java, ho tenuto tutto in un unico file:
package com.sothawo.test;
import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
import java.io.File;
import java.net.URL;
/**
* @author P.J. Meisch ([email protected]).
*/
public class WebViewApplication extends Application {
/** for communication to the Javascript engine. */
private JSObject javascriptConnector;
/** for communication from the Javascript engine. */
private JavaConnector javaConnector = new JavaConnector();;
@Override
public void start(Stage primaryStage) throws Exception {
URL url = new File("./js-sample.html").toURI().toURL();
WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();
// set up the listener
webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
if (Worker.State.SUCCEEDED == newValue) {
// set an interface object named 'javaConnector' in the web engine's page
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);
// get the Javascript connector object.
javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
}
});
Scene scene = new Scene(webView, 300, 150);
primaryStage.setScene(scene);
primaryStage.show();
// now load the page
webEngine.load(url.toString());
}
public class JavaConnector {
/**
* called when the JS side wants a String to be converted.
*
* @param value
* the String to convert
*/
public void toLowerCase(String value) {
if (null != value) {
javascriptConnector.call("showResult", value.toLowerCase());
}
}
}
}
Una volta caricata la pagina, un oggetto JavaConnector
(definito dalla classe interna e creato come campo) viene impostato nella pagina Web da tali chiamate:
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);
L'oggetto javascriptConnector
viene recuperato dalla pagina Web con
javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
Quando viene chiamato il metodo toLowerCase(String)
da JavaConnector
, il valore passato viene convertito e quindi restituito tramite l'oggetto javascriptConnector
.
E questo è il codice html e javascript:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sample</title>
</head>
<body>
<main>
<div><input id="input" type="text"></div>
<button onclick="sendToJava();">to lower case</button>
<div id="result"></div>
</main>
<script type="text/javascript">
function sendToJava () {
var s = document.getElementById('input').value;
javaConnector.toLowerCase(s);
};
var jsConnector = {
showResult: function (result) {
document.getElementById('result').innerHTML = result;
}
};
function getJsConnector() {
return jsConnector;
};
</script>
</body>
</html>
La funzione sendToJava
chiama il metodo del JavaConnector
impostato dal codice Java:
function sendToJava () {
var s = document.getElementById('input').value;
javaConnector.toLowerCase(s);
};
e la funzione chiamata dal codice Java per recuperare javascriptConnector
restituisce semplicemente l'oggetto jsConnector
:
var jsConnector = {
showResult: function (result) {
document.getElementById('result').innerHTML = result;
}
};
function getJsConnector() {
return jsConnector;
};
Il tipo di argomento delle chiamate tra Java e Javascript non è limitato a Stringhe. Ulteriori informazioni sui possibili tipi e conversioni si trovano nel documento dell'API JSObject .