webView:
是一个管理webEngine和显示它中间内容的节点。这个对象只能从fx的线程中创建。
webEngine:
是一个管理网页的不可见控件,它可以加载网页,创建文档模型,运行javascript,加载必要的样式,很重要的是它提供的网页的文档模型很不错,另外,它还可以实现java应用程序和javascript的双向通信。
1.访问页面
1.通过任意的url地址进行访问,基于java.net包来实现,engine.load(String url)即可
2.从in-memory String的方式(内存查找已有网址的字符串) 通过loadContent(java.lang.String)或者
loadContent(java.lang.String, java.lang.String)的方式实现。
-
loadContent(java.lang.String URLcontext):直接加载给定的url内容,当你在内存中有一个要访问的url地址时非常快,或者你要加载一些url无法表示的数据时,用这个。
-
loadContent(java.lang.String URLcontext, java.lang.String contentType):和上面的相比,你可以指定要加载的类型,所以可以加载html以外的类型。
2.回调函数
这些回调函数被调用时,使用页面上的脚本运行请求对用户界面进行操作,例如,打开一个弹出窗口,或改变状态的文本。一个webengine对象不能处理这些请求内部,所以它将请求传递给相应的回调。如果没有回调是一个具体的操作定义,该请求被忽略。
-
The table below shows JavaScript user interface methods and properties with their corresponding
WebEngine
callbacks:JavaScript method/property WebEngine callback window.alert()
onAlert
window.confirm()
confirmHandler
window.open()
createPopupHandler
window.open()
andwindow.close()
onVisibilityChanged
window.prompt()
promptHandler
Setting window.status
onStatusChanged
Setting any of the following: window.innerWidth
,window.innerHeight
,window.outerWidth
,window.outerHeight
,window.screenX
,window.screenY
,window.screenLeft
,window.screenTop
onResized
事例代码:
-
Stage stage;
webEngine.setOnResized(
new EventHandler<WebEvent<Rectangle2D>>() {
public void handle(WebEvent<Rectangle2D> ev) {
Rectangle2D r = ev.getData();
stage.setWidth(r.getWidth());
stage.setHeight(r.getHeight());
}
});
3.文档对象入口
也就是支持dom解析
-
EventListener listener = new EventListener() {
public void handleEvent(Event ev) {
Platform.exit();
}
};
Document doc = webEngine.getDocument();
Element el = doc.getElementById("exit-app");
((EventTarget) el).addEventListener("click", listener, false);
4.执行javascript
webEngine.executeScript("history.back()");
5.就是java和javascript的交互,可以参考api
下面是代码
public class MyWebViewSample extends Application {
public static final String defaultURL="http://www.baidu.com";
@Override
public void start(Stage primaryStage) {
init( primaryStage);
primaryStage.show();
}
private void init(Stage primaryStage){
final Stage stage=primaryStage;
Group group=new Group();//作为根节点,也就是root
primaryStage.setScene(new Scene(group));
WebView webView=new WebView();
final WebEngine engine= webView.getEngine();
engine.load(defaultURL);
final TextField textField=new TextField(defaultURL);
/**修改输入栏的地址,也就是访问那个网站,这个地址栏显示那个网站的地址
* locationProperty()是获得当前页面的url封装好的ReadOnlyStringProperty对象
*/
engine.locationProperty().addListener(new ChangeListener<String>(){
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
textField.setText(newValue);
}
});
/**
* 设置标题栏为当前访问页面的标题。
*/
engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>(){
@Override
public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
if(newValue==Worker.State.SUCCEEDED){
stage.setTitle(engine.getTitle());
}
}
});
/**
* 测试能否获得javascript上面的交互内容。
* 可以自己写一个包含window.alert("neirong")的html进行测试。
* 返回的是neirong
*/
engine.setOnAlert(new EventHandler<WebEvent<String>>() {
@Override
public void handle(WebEvent<String> event) {
System.out.println("this is event"+event);
}
});
//加载新的地址
EventHandler<ActionEvent> handler= new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
engine.load(textField.getText().startsWith("http://")?textField.getText().trim():"http://"+textField.getText().trim());
}
};
textField.setOnAction(handler);
Button okButton=new Button("go");
okButton.setDefaultButton(true);
okButton.setOnAction(handler);
HBox hbox=new HBox();
hbox.getChildren().addAll(textField,okButton);
HBox.setHgrow(textField, Priority.ALWAYS);
VBox vBox=new VBox();
vBox.getChildren().addAll(hbox,webView);
VBox.setVgrow(webView, Priority.ALWAYS);
group.getChildren().add(vBox);
}
/**
*
* @param args
*/
public static void main(String[] args) {
launch(args);
}
}