欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaFX学习之Web

程序员文章站 2022-06-08 10:34:00
...
[b]PopupFeatures[/b] 处理新窗口
[b]WebHistory[/b]
网页一般都带有历史记录的功能,可以回退,也可以前进,fx用WebHistory处理。
final WebHistory wh = webEngine.getHistory();   //获取webhistory
go(int offset) //跳到相对应的页,一般-1是后退,1是前进
getCurrentIndex() //获取当前页索引,开始页索引为0,点击进入下一页此时为1。

[b]WebView[/b] [b]WebEngin[/b]
WebView作为一个node用于显示网页内容
WebView webView = new WebView();

WebEngine用于对网页的操作,通过webView获取web引擎
WebEngine webEngine = webView.getEngine();
WebEngine的一些方法

webEngine.load(java.lang.String url); //加载一个网页
webEngine.executeScript(java.lang.String script) //执行网页中的脚本语言

看个demo
	public void init(Group root){
VBox box = new VBox();
WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();
webEngine.load("http://forums.oracle.com/forums/");
box.getChildren().add(webView);
Button button = new Button("showAll");
button.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent arg0) {
webEngine.executeScript("showAll()");
}
});
box.getChildren().add(button);
root.getChildren().add(box);
}

这里要注意的是,脚本必须是你网页中存在的。

可以在Application中执行网页中的脚本,那么也可以在网页脚本中执行Application方法
JSObject win = (JSObject) webEngine.executeScript("window");  获取js对象
win.setMember("app", new JavaApp()); 然后把应用程序对象设置成为js对象
private class JavaApp {
public void exit() {
Platform.exit();
}
public void login(){
System.out.println("login...");
}
}

此时在页面可以调用
<a href="about:blank" onclick="app.exit()">Exit the Application</a>


在网页上右键点击的时候,可以选择在新窗口打开,此时你必须自己设定。
setCreatePopupHandler(Callback<PopupFeatures,WebEngine> handler)  //处理弹出窗口。
webEngine.setCreatePopupHandler(
new Callback<PopupFeatures, WebEngine>() {
@Override public WebEngine call(PopupFeatures config) {
return newWebView.getEngine();
}
}
);

网页是通过WebView显示的,所以当你需要一个新窗口时,你必须弄一个新的webView,并为该webview设置好显示的位置,然后在上面的代码中获取该webview的webengine返回。

发现加载web页面需要一段时期,此时application的一些节点显示出来了,若是想让节点显示和web一起显示,则可以监听webEngine的状态属性。
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
//添加节点,或者把app注入到网页脚本当中
}
}
}
);

看个demo:
	public void init(Group root){
final TabPane tp = new TabPane();
WebView webView = new WebView();
System.out.println(root.getScene());
webView.prefWidthProperty().bind(root.getScene().widthProperty());
webView.prefHeightProperty().bind(root.getScene().heightProperty());
final WebEngine webEngine = webView.getEngine();
webEngine.load("http://forums.oracle.com/forums/");
webEngine.setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {

@Override
public WebEngine call(PopupFeatures arg0) {
WebView newWebView = new WebView();
WebEngine newWebEngine = newWebView.getEngine();
Tab tab = new Tab("new Window");
tab.textProperty().bind(newWebEngine.titleProperty());
tab.setContent(newWebView);
tp.getTabs().add(tab);
return newWebEngine;
}
});
final Tab tab = new Tab();
tab.textProperty().bind(webEngine.titleProperty());
tab.setContent(webView);
// process page loading
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
tp.getTabs().add(tab);
}
}
}
);
root.getChildren().add(tp);
}


[b]PromptData[/b]
[b]WebEvent[/b]
[b]HTMLEditor[/b]
相关标签: javafx web 网页