当前位置: 首页 > 知识库问答 >
问题:

检测JavaFX WebView中的URL更改

孔鸿哲
2023-03-14

在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());

你知道我做错了什么吗?

共有1个答案

阎昌勋
2023-03-14

(部分)你做错了什么

您在问题中提供的代码甚至没有编译。ChangeListener的changed方法是一个void函数,它不能返回任何值。

无论如何,在Web视图中加载内容是一个异步过程。如果您希望在Web视图加载后获得Web视图位置的值,您需要等待加载完成(在JavaFX应用程序线程上不建议这样做,因为这会挂起您的应用程序直到加载完成),或者在回调中收到加载完成的通知(这是您拥有的侦听器正在做的事情)。

(可能)你想做什么

将一些属性绑定到Web引擎的位置属性。例如:

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.
});
 类似资料:
  • 问题内容: 我只是在http://ritter.vg上设置了新主页。我正在使用jQuery,但是使用的次数很少。 它使用AJAX加载所有页面-我将其设置为通过检测URL中的哈希来允许添加书签。 但是我无法使用后退和前进按钮。 有没有一种方法可以在不使用setInterval循环的情况下检测何时按下后退按钮(或检测哈希值何时变化)?当我尝试使用.2和1秒超时的那些时,它挂住了我的CPU。 问题答案:

  • 问题内容: 我正在使用WKWebview开发简单的Web浏览器。我可以检测到SPA时url是否更改,例如trello带有自定义Javascript。 这种方式在放大器页面不起作用。(Google的“加速移动网页”)我尝试使用所有功能,但无法检测到的变化。 但是具有amp页面网址,我想将amp页面网址保存到本地存储。 问题答案: 同样的问题。不幸的是,WKWebView仅在整个页面加载发生时才触发其

  • 问题内容: 当某些div或输入添加到html时,我想执行一个函数。这可能吗? 例如,添加文本输入,然后应调用该函数。 问题答案: 现代浏览器支持新功能: Chrome 18以上版本,Firefox 14以上版本,IE 11以上版本,Safari 6以上版本 如果您需要支持较旧的方法,则可以尝试使用其他方法,例如下面这个5(!)年的答案中提到的方法。有龙。请享用 :) 有人在更改文档吗?因为如果您完

  • 问题内容: WKWebView类是否具有一个函数,可让您检测该WebView的URL是否已更改? 使用WebView中的某些元素时,and 函数似乎并不总是会触发。 编辑: 尝试添加一个通知观察器。到目前为止,这是我所拥有的: 问题答案: 您是什么意思,他们似乎并不总是会开除?什么样的元素?他们必须为了WkWebView起作用。 该URL试图更改的第一个迹象是在:DecisionPolicyFor

  • 问题内容: 有没有人建议检测一组字符串中的URL? 更新: 我结束了使用此正则表达式进行链接检测……显然几年后。 问题答案: 首先,您需要一个与网址匹配的优质正则表达式。这很难做到。 …几乎所有内容都是有效的网址。有一些标点符号规则将其拆分。没有标点符号,您仍然有一个有效的URL。 仔细检查RFC,看看是否可以构造“无效” URL。规则非常灵活。 例如,一个有效的URL。路径是。漂亮的文件名,但是

  • 问题内容: 如何检查JavaScript中的URL是否已更改?例如,使用AJAX的GitHub之类的网站将在#符号后附加页面信息以创建唯一URL,而无需重新加载页面。检测此URL是否更改的最佳方法是什么? 是否再次调用该事件? URL是否有事件处理程序? 还是必须每秒检查一次URL以检测更改? 问题答案: 在现代浏览器(IE8 +,FF3.6 +,Chrome)中,您只能在上收听事件。 在某些旧的