(часть), что вы делаете неправильно
код, который вы предоставили в вопросе даже не компилируется. Измененный метод ChangeListener является функцией void, он не может вернуть какое-либо значение.
В любом случае, загрузка материала в веб-представление является асинхронным процессом. Если вы хотите, чтобы значение местоположения веб-представления после загрузки веб-представления было загружено, вам нужно либо дождаться завершения загрузки (нецелесообразно в потоке приложений JavaFX, так как это повесит ваше приложение до завершения загрузки), или быть уведомленным в обратном вызове, что загрузка завершена (это то, что делает ваш слушатель).
(возможно), что вы хотите сделать
Bind некоторое свойство к месту расположения недвижимости веб-движка. Например:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.web.*;
import javafx.stage.Stage;
public class LocationViewer extends Application {
@Override
public void start(Stage stage) throws Exception {
Label location = new Label();
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
engine.load("http://www.fxexperience.com");
location.textProperty().bind(engine.locationProperty());
Scene scene = new Scene(new VBox(10, location, webView));
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Приведенный выше код будет обновлять метку местоположения, когда местоположение изменений веб-просмотра (попробовать его, запустив код, а затем нажав на некоторые ссылки). Если вы хотите обновить только этикетки, как только страница была успешно загружена, то вам нужен слушатель, основываясь на состоянии WebView, например:
import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.web.*;
import javafx.stage.Stage;
public class LocationAfterLoadViewer extends Application {
@Override
public void start(Stage stage) throws Exception {
Label location = new Label();
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
engine.load("http://www.fxexperience.com");
engine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
if (Worker.State.SUCCEEDED.equals(newValue)) {
location.setText(engine.getLocation());
}
});
Scene scene = new Scene(new VBox(10, location, webView));
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Если вы запустите последнюю программу и нажмите на некоторые ссылки, вы будете обратите внимание, что это задерживает обновление метки местоположения до тех пор, пока страницы, на которые вы нажмете полностью завершите загрузку, в отличие от первой программы, которая обновляет метку, как только изменяется местоположение, независимо от того, занимает ли загрузка какое-то время или действительно работает вообще ,
Ответы на дополнительные вопросы
Как я могу использовать значение URL-адрес в метке в условном операторе? Я хочу, чтобы действие было выполнено, если оно изменилось с исходного.
location.textProperty().addListener((observable, oldValue, newValue) -> {
// perform required action.
});
Ницца! Огромное спасибо. Это работает отлично. – user6130327