附加文本WebEngine - JavaFX
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了附加文本WebEngine - JavaFX相关的知识,希望对你有一定的参考价值。
如何将文本附加到webengine?我试过这个:
public TabMessage(String title) {
super(title);
view = new WebView();
engine = view.getEngine();
engine.loadContent("<body></body>");
view.setPrefHeight(240);
}
private void append(String msg){
Document doc = engine.getDocument();
Element el = doc.getElementById("body");
String s = el.getTextContent();
el.setTextContent(s+msg);
}
但文件是null
您也可以使用javascript来执行追加。
final WebEngine appendEngine = view.getEngine();
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
appendEngine.executeScript(
"document.getElementById('content').appendChild(document.createTextNode('World!'));"
);
}
});
我有时会发现使用jQuery操作DOM而不是Java Document或本机JavaScript DOM接口更简单。
final WebEngine appendEngine = view.getEngine();
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
executejQuery(appendEngine, "$('#content').append('World!');");
}
});
...
private static Object executejQuery(final WebEngine engine, String script) {
return engine.executeScript(
"(function(window, document, version, callback) { "
+ "var j, d;"
+ "var loaded = false;"
+ "if (!(j = window.jQuery) || version > j.fn.jquery || callback(j, loaded)) {"
+ " var script = document.createElement("script");"
+ " script.type = "text/javascript";"
+ " script.src = "http://code.jquery.com/jquery-1.7.2.min.js";"
+ " script.onload = script.onreadystatechange = function() {"
+ " if (!loaded && (!(d = this.readyState) || d == "loaded" || d == "complete")) {"
+ " callback((j = window.jQuery).noConflict(1), loaded = true);"
+ " j(script).remove();"
+ " }"
+ " };"
+ " document.documentElement.childNodes[0].appendChild(script) "
+ "} "
+ "})(window, document, "1.7.2", function($, jquery_loaded) {" + script + "});"
);
}
无论您是使用Java文档API,还是使用Uluk,还是JavaScript或JQuery API,Uluk的优秀答案中的所有其他要点仍然适用。
首先,如果webengine无法加载内容,或者在内容完全加载之前调用engine.getDocument()
,则Document返回null。
其次,doc.getElementById("body")
搜索id为“body”的DOM元素。但是,您加载的内容根本没有此ID或任何ID。
要在这里更好地理解这些是一个完整的可运行示例,请单击按钮:
package demo;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class Demo extends Application {
private WebView view;
private WebEngine engine;
@Override
public void start(Stage primaryStage) {
view = new WebView();
engine = view.getEngine();
engine.loadContent("<body><div id='content'>Hello </div></body>");
view.setPrefHeight(240);
Button btn = new Button("Append the "World!"");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
append(" "World!"");
}
});
StackPane root = new StackPane();
root.getChildren().addAll(view, btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
private void append(String msg) {
Document doc = engine.getDocument();
Element el = doc.getElementById("content");
String s = el.getTextContent();
el.setTextContent(s + msg);
}
public static void main(String[] args) {
launch(args);
}
}
请注意,我在主体中放置了id = content的div,因此qazxsw poi返回该div。
虽然答案很老,已经被接受,但我在这里发现了我的发现。
诀窍是在控制器的init方法中调用engine.loadContent,然后尝试在示例btn.setOnAction()中提到的某些操作上追加内容。这样,当您触发操作时,页面已经加载。如果我在setOnAction()本身中加载代码,我将文档作为null。
以上是关于附加文本WebEngine - JavaFX的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX WebEngine上的UserAgent实现方法
JavaFX 2.0+ WebView /WebEngine 将网页呈现为图像
JavaFX 8 WebEngine:如何从 javascript 获取 console.log() 到 java 中的 System.out?