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