javafx
WebView i WebEngine
Szukaj…
Uwagi
WebView
to węzeł JavaFX zintegrowany z drzewem komponentów JavaFX. Zarządza WebEngine
i wyświetla jego zawartość.
WebEngine
to podstawowy silnik przeglądarki, który zasadniczo wykonuje całą pracę.
Ładowanie strony
WebView wv = new WebView();
WebEngine we = wv.getEngine();
we.load("https://stackoverflow.com");
WebView
to powłoka interfejsu użytkownika wokół WebEngine
. Prawie wszystkie formanty interakcji bez interfejsu użytkownika ze stroną są wykonywane za WebEngine
klasy WebEngine
.
Pobierz historię stron WebView
WebHistory history = webView.getEngine().getHistory();
Historia jest w zasadzie listą wpisów. Każdy wpis reprezentuje odwiedzoną stronę i zapewnia dostęp do odpowiednich informacji o stronie, takich jak adres URL, tytuł i data ostatniej wizyty na stronie.
Listę można uzyskać za pomocą metody getEntries()
. Historia i odpowiadająca jej lista wpisów zmieniają się, gdy WebEngine
porusza się po Internecie. Lista może się rozszerzać lub zmniejszać w zależności od działań przeglądarki. Zmiany te mogą być podsłuchiwane przez ObservableList API, które ujawnia lista.
Indeks wpisu historii powiązanego z aktualnie odwiedzaną stroną jest reprezentowany przez currentIndexProperty()
. Bieżącego indeksu można użyć do przejścia do dowolnego wpisu w historii za pomocą metody go(int)
. Metoda maxSizeProperty()
ustawia maksymalny rozmiar historii, który jest rozmiarem listy historii
Poniżej znajduje się przykład uzyskiwania i przetwarzania Listy elementów historii online .
ComboBox
(comboBox) służy do przechowywania elementów historii. Za pomocą ListChangeListener
w WebHistory
ComboBox
zostaje zaktualizowany do bieżącej WebHistory
. W ComboBox
znajduje się EventHandler
który przekierowuje na wybraną stronę.
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();
}
});
wysyłaj alerty JavaScript z wyświetlanej strony internetowej do dziennika aplikacji 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()));
Komunikacja między aplikacją Java i Javascript na stronie internetowej
Podczas korzystania z WebView do wyświetlania własnej niestandardowej strony internetowej, która zawiera Javascript, może być konieczne ustanowienie dwukierunkowej komunikacji między programem Java i Javascript na stronie internetowej.
Ten przykład pokazuje, jak skonfigurować taką komunikację.
Strona internetowa wyświetla pole wprowadzania i przycisk. Po kliknięciu przycisku wartość z pola wejściowego jest wysyłana do aplikacji Java, która ją przetwarza. Po przetworzeniu wynik jest wysyłany do Javascript, który z kolei wyświetla wynik na stronie internetowej.
Podstawową zasadą jest to, że do komunikacji z Javascript do Java tworzony jest obiekt w Javie, który jest ustawiany na stronie internetowej. Z drugiej strony obiekt jest tworzony w JavaScript i pobierany ze strony internetowej.
Poniższy kod pokazuje część Java, zachowałem to wszystko w jednym pliku:
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());
}
}
}
}
Po załadowaniu JavaConnector
obiekt JavaConnector
(zdefiniowany przez klasę wewnętrzną i utworzony jako pole) jest ustawiany na stronie internetowej przez następujące wywołania:
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);
Obiekt javascriptConnector
jest pobierany ze strony za pomocą
javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
Po JavaConnector
metody toLowerCase(String)
z JavaConnector
przekazywana wartość jest konwertowana, a następnie odsyłana za pośrednictwem obiektu javascriptConnector
.
A to jest kod HTML i 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>
Funkcja sendToJava
wywołuje metodę JavaConnector
ustawioną przez kod Java:
function sendToJava () {
var s = document.getElementById('input').value;
javaConnector.toLowerCase(s);
};
a funkcja wywoływana przez kod Java w celu pobrania javascriptConnector
po prostu zwraca obiekt jsConnector
:
var jsConnector = {
showResult: function (result) {
document.getElementById('result').innerHTML = result;
}
};
function getJsConnector() {
return jsConnector;
};
Typ argumentu wywołań między Javą a Javascriptem nie jest ograniczony do ciągów. Więcej informacji na temat możliwych typów i konwersji można znaleźć w dokumencie API JSObject .