Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXWebEngine:我需要我的ChangeListener知道它的触发器WebEngine_Java_Javafx - Fatal编程技术网

JavaFXWebEngine:我需要我的ChangeListener知道它的触发器WebEngine

JavaFXWebEngine:我需要我的ChangeListener知道它的触发器WebEngine,java,javafx,Java,Javafx,在我的JavaFX项目中,我在WebView的WebEngine上有一个侦听器,它等待网站完全呈现。然后我需要访问生成的DOM文档。如果我不知道侦听器属于哪个Web引擎,这就不起作用 创建变量或仅使用现有的webView不是一个选项!这是因为我正在使用ChangeListeners创建几个Web视图。 现在如何将它们分配给彼此 webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<

在我的JavaFX项目中,我在WebView的WebEngine上有一个侦听器,它等待网站完全呈现。然后我需要访问生成的DOM文档。如果我不知道侦听器属于哪个Web引擎,这就不起作用

创建变量或仅使用现有的
webView
不是一个选项!这是因为我正在使用ChangeListeners创建几个Web视图。 现在如何将它们分配给彼此

webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
     public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
        if (newState == Worker.State.SUCCEEDED) {
            // Here I do my stuff
            // I need to access webView.getEngine().getDocument()
        }
     }
});
sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>


<GridPane alignment="center" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9" fx:controller="sample.Controller">
   <columnConstraints>
      <ColumnConstraints />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints />
   </rowConstraints>
   <children>
      <VBox fx:id="browsers" prefHeight="200.0" prefWidth="100.0" />
   </children>
</GridPane>

使用
WebView
setUserData
和switch语句跟踪不同站点上发生的更改。如果您单击站点上的某个链接,它将告诉您是哪个
WebView
处理了该链接

private void findSomething()
{
    for (int i = 0; i < 5; i++) {
        System.out.println("Request to " + urls[i]);
        WebView webView = ctrl.createWebView();
        webView.setUserData(urls[i]);
        webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>()
        {
            @Override
            public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState)
            {
                if (newState == Worker.State.SUCCEEDED) {
                    // The BIG QUESTION is: What is the corresponding WebEngine to call?
                    Document doc = webView.getEngine().getDocument();

                    String userData = webView.getUserData().toString();
                    switch (userData) {
                        case "https://google.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the google site");
                            System.out.println("");
                            break;
                        case "https://youtube.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the youtube site");
                            break;
                        case "https://facebook.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the facebook site");
                            break;
                        case "https://twitter.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the twitter site");
                            break;
                        case "https://stackoverflow.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the stackoverflow site");
                            break;
                    }

                    // As you will see, the responses print in totally random order
                }
            }
        });

        webView.getEngine().load(urls[i]);
    }
}
private void findSomething()
{
对于(int i=0;i<5;i++){
System.out.println(“请求”+URL[i]);
WebView WebView=ctrl.createWebView();
setUserData(URL[i]);
webView.getEngine().getLoadWorker().stateProperty().addListener(新的ChangeListener())
{
@凌驾
公共无效已更改(observeValue ov,Worker.State oldState,Worker.State newState)
{
if(newState==Worker.State.successed){
//最大的问题是:相应的WebEngine要调用什么?
Document doc=webView.getEngine().getDocument();
字符串userData=webView.getUserData().toString();
开关(用户数据){
案例”https://google.com":
System.out.println(doc.getElementsByTagName(“title”).item(0.getTextContent());
System.out.println(“对谷歌网站做点什么”);
System.out.println(“”);
打破
案例”https://youtube.com":
System.out.println(doc.getElementsByTagName(“title”).item(0.getTextContent());
System.out.println(“对youtube网站做点什么”);
打破
案例”https://facebook.com":
System.out.println(doc.getElementsByTagName(“title”).item(0.getTextContent());
System.out.println(“对facebook网站做点什么”);
打破
案例”https://twitter.com":
System.out.println(doc.getElementsByTagName(“title”).item(0.getTextContent());
System.out.println(“对twitter网站做点什么”);
打破
案例”https://stackoverflow.com":
System.out.println(doc.getElementsByTagName(“title”).item(0.getTextContent());
System.out.println(“处理stackoverflow站点”);
打破
}
//正如您将看到的,响应以完全随机的顺序打印
}
}
});
加载(URL[i]);
}
}

不清楚您所要求的内容是否可能重复。演示一下你所拥有的。@Sedrick抱歉。基本上,我只需要访问分配了侦听器的WebEngine的ChangeListener changed方法。请提供一个示例来说明问题。无论如何,当您注册侦听器时,您似乎已经拥有了引擎,那么为什么不在内部使用它呢?从您的代码中,您只需在
更改的
方法中调用
webView.getEngine().getDocument()
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>


<GridPane alignment="center" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9" fx:controller="sample.Controller">
   <columnConstraints>
      <ColumnConstraints />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints />
   </rowConstraints>
   <children>
      <VBox fx:id="browsers" prefHeight="200.0" prefWidth="100.0" />
   </children>
</GridPane>
private void findSomething()
{
    for (int i = 0; i < 5; i++) {
        System.out.println("Request to " + urls[i]);
        WebView webView = ctrl.createWebView();
        webView.setUserData(urls[i]);
        webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>()
        {
            @Override
            public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState)
            {
                if (newState == Worker.State.SUCCEEDED) {
                    // The BIG QUESTION is: What is the corresponding WebEngine to call?
                    Document doc = webView.getEngine().getDocument();

                    String userData = webView.getUserData().toString();
                    switch (userData) {
                        case "https://google.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the google site");
                            System.out.println("");
                            break;
                        case "https://youtube.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the youtube site");
                            break;
                        case "https://facebook.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the facebook site");
                            break;
                        case "https://twitter.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the twitter site");
                            break;
                        case "https://stackoverflow.com":
                            System.out.println(doc.getElementsByTagName("title").item(0).getTextContent());
                            System.out.println("Do something with the stackoverflow site");
                            break;
                    }

                    // As you will see, the responses print in totally random order
                }
            }
        });

        webView.getEngine().load(urls[i]);
    }
}