2016-03-30 1 views
3

В веб-просмотре JavaFx я изо всех сил пытаюсь обнаружить изменение URL-адреса.обнаружить изменение URL-адреса в Javafx webview

У меня есть этот метод в классе:

 public Object urlchange(){ 

    engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() { 
    @Override 
    public void changed(ObservableValue ov, State oldState, State newState) { 

      if (newState == Worker.State.SUCCEEDED) { 
       return engine.getLocation()); 
      } 

    } 
    });  

    } 

, и я пытаюсь использовать его для объекта под названием loginbrowser как:

System.out.print(loginbrowser.urlchange()); 

Можете ли вы увидеть, что я сделал не так?

ответ

4

(часть), что вы делаете неправильно

код, который вы предоставили в вопросе даже не компилируется. Измененный метод 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. 
}); 
+0

Ницца! Огромное спасибо. Это работает отлично. – user6130327

 Смежные вопросы

  • Нет связанных вопросов^_^