javafx
WebView и WebEngine
Поиск…
замечания
WebView
- это узел JavaFX, который интегрирован в дерево компонентов JavaFX. Он управляет WebEngine
и отображает его содержимое.
WebEngine
является основным WebEngine
, который в основном выполняет всю работу.
Загрузка страницы
WebView wv = new WebView();
WebEngine we = wv.getEngine();
we.load("https://stackoverflow.com");
WebView
- это оболочка пользовательского интерфейса вокруг WebEngine
. Почти все элементы управления для взаимодействия с пользователем не связаны с классом WebEngine
.
Получить историю страниц WebView
WebHistory history = webView.getEngine().getHistory();
История - это в основном список записей. Каждая запись представляет посещенную страницу и обеспечивает доступ к соответствующей информации о странице, такой как URL, название и дата последнего посещения страницы.
Список можно получить, используя метод getEntries()
. История и соответствующий список записей изменяются, так как WebEngine
перемещается по сети. Список может расширяться или сокращаться в зависимости от действий браузера. Эти изменения можно прослушать с помощью API ObservableList, который раскрывает список.
Индекс записи истории, связанный с текущей посещенной страницей, представлен currentIndexProperty()
. Текущий индекс можно использовать для перехода к любой записи в истории с помощью метода go(int)
. maxSizeProperty()
устанавливает максимальный размер истории, который представляет собой размер списка истории
Ниже приведен пример получения и обработки списка элементов истории веб-поиска .
Для хранения элементов истории используется ComboBox
(comboBox). Используя ListChangeListener
в WebHistory
ComboBox
обновляется до текущей WebHistory
. В ComboBox
есть EventHandler
который перенаправляется на выбранную страницу.
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();
}
});
отправьте предупреждения Javascript с отображаемой веб-страницы в журнал приложений 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()));
Связь между Java-приложением и Javascript на веб-странице
При использовании WebView для отображения собственной пользовательской веб-страницы, и эта веб-страница содержит Javascript, возможно, потребуется установить двустороннюю связь между программой Java и Javascript на веб-странице.
В этом примере показано, как настроить такое сообщение.
На веб-странице должно отображаться поле ввода и кнопка. При нажатии кнопки значение из поля ввода отправляется в приложение Java, которое обрабатывает его. После обработки результат отправляется на Javascript, который, в свою очередь, отображает результат на веб-странице.
Основной принцип заключается в том, что для связи с Javascript в Java объект создается в Java, который установлен на веб-странице. А для другого направления объект создается в Javascript и извлекается с веб-страницы.
Следующий код показывает часть Java, я сохранил все это в одном файле:
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());
}
}
}
}
Когда страница загружается, объект JavaConnector
(который определяется внутренним классом и создается как поле) устанавливается на веб-страницу этими вызовами:
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);
Объект javascriptConnector
извлекается с веб-страницы с помощью
javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
Когда toLowerCase(String)
метод toLowerCase(String)
из JavaConnector
, переданное значение преобразуется и затем отправляется обратно через объект javascriptConnector
.
И это код html и 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>
Функция sendToJava
вызывает метод JavaConnector
который был задан кодом Java:
function sendToJava () {
var s = document.getElementById('input').value;
javaConnector.toLowerCase(s);
};
и функция, вызываемая кодом Java для извлечения javascriptConnector
возвращает объект jsConnector
:
var jsConnector = {
showResult: function (result) {
document.getElementById('result').innerHTML = result;
}
};
function getJsConnector() {
return jsConnector;
};
Тип аргумента вызовов между Java и Javascript не ограничивается строками. Более подробная информация о возможных типах и конверсиях содержится в документе JSObject API .