在JavaFX的WebView
中,我正在努力检测URL的变化。
我在课堂上有这个方法:
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());
你能看出我做错了吗?
答案 0 :(得分:7)
(部分)你做错了什么
您在问题中提供的代码甚至无法编译。 ChangeListener的更改方法是void函数,它不能返回任何值。
无论如何,在Web视图中加载东西是一个异步过程。如果您想在加载Web视图后获取Web视图的位置值,则需要等待加载完成(在JavaFX应用程序线程上不可取,因为这会挂起您的应用程序,直到加载完成),或者在回调中被通知负载完成(这是你正在做的听众)。
(可能)你想做什么
将某些属性绑定到Web引擎的location属性。例如:
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);
}
}
只要Web视图的位置发生更改,上面的代码就会更新位置标签(通过运行代码然后单击某些链接来尝试)。如果您希望仅在页面成功加载后更新标签,则需要基于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.
});