html5开发app的技术大行其道的今天,衍生出了apicloud,appcan,dcloud,phonegap等一系列工具,但是无论html5技术发展到多强大,感觉都只是手机端的技术。不知道大家是否有想过,明明电脑端的浏览器也已经非常强大了,是否html5技术也已经可以用于开发桌面应用了呢?
答案是肯定的,html5技术是可以用于开发桌面应用的。只是由于目前桌面应用的萎靡,很少有第三方厂商去开发打包工具。所以,才显得不是特别的成熟。实际上我们使用的很多应用可能都已经是一个html5软件了呢。
下面,小沃就来教教大家通过java最新的图形化开发工具javafx去开发一个html5应用。(这里javafx是什么小沃就不多介绍了,感兴趣的同学请自行百度)
想要打包html5应用,最主要的控件就是webview,而javafx自带一个webview。
该webview基于开源web浏览器引擎WebKit。其支持CSS、JavaScript、DOM和HTML5。
内嵌浏览器的架构

WebEngine类
WebEngine类提供了基本的web页面功能。尽管它并不与用户直接交互,但它也支持用户交互,如导航链接和提交HTML表单。WebEngine类一次处理一个web页面。它支持加载HTML内容和访问DOM对象等基本功能,也支持执行JavaScript指令。
有两个构造方法能够创建WebEngine对象:空构造和带一个URL参数的构造。如果你使用空构造方法来实例化它,那么URL可以通过WebEngine对象的load()方法来传入。
从JavaFX SDK2.2开始,开发人员可以为某个特定的web engine启用/禁用JavaScript调用,以及应用自定义样式表。用户可以使用自定义的样式表替换WebEngine实例渲染的页面中的默认样式表。
WebView类
WebView类是Node类的一个扩展。它封装了WebEngine对象,将HTML内容加入程序的scene中,并且提供各种属性和方法来应用特效和变换。WebView对象的getEngine()方法返回一个与之关联的web engine。
设置Scene的宽高
由于我们要将他伪造成app,因此通常需要全屏,这里我们可以设置stage.setFullScreen(true);
如果要任意设置宽高,可以在scene = new Scene(new Browser(), 500, 300);stage.setScene(scene);这里修改500与300这两个参数。
设置webview的宽高与scene完全一致
这里需要在继承了Region类的函数中添加layoutChildren方法,然后在这个方法中执行layoutInArea函数。
下面是小沃为大家贡献的一段代码,让百度来做炮灰吧。
Main.java
package javafx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
private Scene scene;
public static void main(String[] args) {
// TODO Auto-generated method stub
launch(args);
}
@Override
public void start(Stage arg0) throws Exception {
// TODO Auto-generated method stub
arg0.setTitle("沃航武汉科技有限公司");
arg0.setFullScreen(true);
scene = new Scene(new Browser());
arg0.setScene(scene);
arg0.show();
}
}Browser.java
package javafx;
import java.util.Timer;
import java.util.TimerTask;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class Browser extends Region {
private WebView browser = null;
private WebEngine webEngine = null;
private Button btn = null;
private Integer i = null;
private Timer timer = null;
public Browser() {
browser = new WebView();
webEngine = browser.getEngine();
i = 0;
webEngine.load("https://tools.worldflying.cn/phpinfo.php");
getChildren().add(browser);
btn = new Button();
btn.setOnAction((ActionEvent e) -> {
BtnClick();
});
btn.setStyle("-fx-opacity:0;-fx-pref-width:100px;-fx-pref-height:30px;");
getChildren().add(btn);
}
@Override
public void layoutChildren() {
super.layoutChildren();
double w = getWidth();
double h = getHeight();
layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
}
public void BtnClick() {
i++;
if(timer != null) {
timer.cancel();
}
timer = new Timer();
if(i == 5) {
System.exit(0);
} else {
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
i = 0;
}
}, 5000);
}
}
}其实运行起来后,大家都能看得见,这个代码有一部分是上面没有讲到的,就是添加了一个button按钮在左上角,作用是点击button后程序自动关闭。
另外,javafx可以实现js函数绑定到java函数中的效果,因此作为最新式的java ui实现方法。javafx前途旷阔,可惜小沃对于前端的ui专注于html5技术,否则也应该会爱上它吧。