ã¢ããªã±ãŒã·ã§ã³ã®åºæ¬çãªUIãã¬ãŒã ã¯ãŒã¯ã¯JavaFXãéžæããŸããã JavaFXã¯çŽ æŽãããä»äºãããŸããã åãèšäºã§ã1ã€ã®JavaFXã³ã³ããŒãã³ãã§ããWebViewã«éäžãããã£ãã®ã§ãã
ã¢ããªã±ãŒã·ã§ã³ïŒCOLTã€ã³ã¿ãŒãã§ã€ã¹ïŒãéçºããéãUIã³ã³ããŒãã³ãã®äžéšãJavaScript / HTMLã§å®è£ ãããŠããå Žåãéçºè ã®éã§äººæ°ãé«ãŸã£ãŠããã¢ãããŒãã䜿çšããŸããã
HTML / JSããŒã¹ã®ã³ã³ããŒãã³ãã¯ãéåžžã®Javaã¯ã©ã¹ãWebViewã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãå«ãHBoxãŸãã¯åãªããã€ã³ãåããéåžžã®JavaFXã³ã³ããŒãã³ãã§ãã
JavaFXã§Webkitãã€ã³ã¹ã¿ã³ã¹åããHTMLãããŒãããæ¹æ³
WebView webView = new WebView(); WebEngine engine = webView.getEngine(); engine.load(this.getClass().getResource("html/webview.html").toExternalForm())
ã¢ããªã±ãŒã·ã§ã³ã§Webãã¯ãããžãŒã䜿çšããŠåŸããã®ã
å€æ°ã®ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³
jQueryãD3ã¯ãã»ãŒãã¹ãŠã®ã¿ã¹ã¯ãã«ããŒããŠããŸãã æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ã-5åã§Googleã§æ€çŽ¢ã§ããŸãã ã€ã³ã¿ãŒãããå šäœãã€ã³ã¿ãŒãã§ãŒã¹èŠçŽ ã®é¡äŒŒç©ã§ãã£ã±ãã«ãªã£ãŠããã®ã¯çŽ æŽãããããšã§ãã ãããŠããã¹ãŠããããªãã¯ãã¡ã€ã³ã«ãããŸãã ããªãã¯ã¢ã€ãã¢ãã®ããèŠãããã®å®è£ ãåãããšãã§ããŸãã
å®ã
Javaã§ã¯ãJS / HTMLã§å®è£ ãããã®ãæžãã®ã¯é£ããã§ãããã
ããšãã°ããã®ã³ã³ããŒãã³ãã¯ãã¹ãè¿œå ããããã®ãã®ã§ãã åºç€ãšããŠãTagã®ãšã³ãžã³ã䜿çšãã培åºçã«ããããã³ã°ãããŸããã ããã¯éåžžã«ã¹ããŒãã§çŽ æŽãããããšã§ããã ãã¿ã°ãã¢ãŒãã§ç·šéããããšãã§ãããããããã«ã¯ãªãã¯ããããšã§ãããã¹ããç°¡åã«æäœã§ããŸãã ã¯ãªããããŒããæäœããŸãã
ããã«å ç«ã¡ã以åã®ããŒãžã§ã³ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãugããªã¹ããã¥ãŒã䜿çšããŠããŸããã æ°ãããã¡ã€ã«ã»ããã¯ãã·ã³ãã«ã§ã³ã³ãã¯ããã¢ãã³ã§ãã æ©èœãæ¡åŒµããæ¹æ³ã«ã€ããŠã®ã¢ã€ãã¢ããããŸãã
2çªç®ã®äŸã¯ãã°ãã¥ãŒã§ãã
æåã«ãListViewã«åºã¥ããŠã³ã³ããŒãã³ããäœæããå¿ èŠããããŸããã ã¹ããã³ã°ã«é¢ããŠç¹å¥ãªåé¡ã¯çºçããŸããã§ããããããã§ãã³ã³ããŒãã³ãã¯ãŠãŒã¶ãŒã«ããå®éã®äœ¿çšã«ã¯é©ããªãããšãå€æããŸããã ããšãã°ããã°ãããã¹ããšããŠéžæããããšã¯äžå¯èœã§ãããäžåºŠã«è€æ°ã®ãããã¯ããããã³ã³ããŒãã³ãã®å®è£ ãããªãã®éã®ã³ãŒãã«æº¢ããæãããããŸããã HTMLã³ã³ããŒãã³ãã¯è»œéã§æ¡åŒµå¯èœã§ãã JavaFXã¯GPUã䜿çšããŠDOMãã¬ã³ããªã³ã°ãããããã³ã³ããŒãã³ãã®çç£æ§ã¯éåžžã«é«ãããšã«æ³šæããŠãã ããã ãã°ããã£ã«ã¿ãŒãªã©ã§æ€çŽ¢ããŠã³ã³ããŒãã³ããæ¡åŒµããäºå®ã§ãã ããããã¹ãŠãJavaScript / CSSã䜿çšããŠå®è£ ããäºå®ã§ãã
Java-UIãããŸãåŸæã§ã¯ãªããããããŸããããè€éãªå¯Ÿè©±æ§ãåããJavaã³ã³ããŒãã³ããæžãããšã¯æ¬åœã«å°é£ã§ããã æ¢è£œã®ã³ã³ããŒãã³ããå¿ èŠãªå Žåããã°ãŒã°ã«ãã§ããäŸ-ã¯ãããã¹ãŠãç°¡åã§ã·ã³ãã«ã§ãã ããã€ã³ããã«ããããŒã¿ãšãã¥ãŒã®ãã€ã³ãã¯ãéåžžã«ã·ã³ãã«ã§äœ¿ãæ £ããŠããŸãïŒä»¥åã®çµéšã¯Adobe Flexã§ãïŒã ããããããã¥ã¡ã³ãã«èšèŒãããŠããæšæºçãªã±ãŒã¹ãè¶ ãããã®ã«ãªããšããã¬ãã¥ãŒãã«æéãããããããŸããã
次ã®ã¹ããŒã ãéçºããŸãããJavaFXã³ã³ããŒãã³ãã䜿çšããŠãããå®è¡ããããšããŠããŸãããå£ã«ã¶ã€ããããŸãã¯å®è£ ãäžå¿ èŠã«è€éãªå Žåã¯ãHTMLã§èšè¿°ããŸãã ãã®ã¢ãããŒãã«ãããéçºãå€§å¹ ã«å éãããŸããã
ã¯ãã¹ãã©ãããã©ãŒã
JavaFXã®Webviewãšã³ãžã³ã¯Webkitã§ãã ã©ã®ãã©ãããã©ãŒã ã§ãåãããã«åäœããŸãã ã¯ãã¹ãã©ãããã©ãŒã ã«ã¯ã»ãšãã©æéãè²»ãããŠããŸããã
Javascriptããªããž
Java-JavaScriptã®æããããã®éã®ããªããžã«ãããJavaããJavaScriptã³ãŒããåŒã³åºãã ãã§ãªããHTMLããJavaã¯ã©ã¹ã¡ãœãããåŒã³åºãããšãã§ããŸãã Javaã³ãŒãã®ç°¡åãªäŸïŒ
private void clear() { JSObject windowObject = (JSObject)webView.getEngine().executeScript("window"); windowObject.call("test", new ArrayList(1, 2, 3)); }
ãããŠãããŒã¿ãååŸããŠArrayList javaã¡ãœãããåŒã³åºããã®JavaScriptã³ãŒã-
function test(list){ console.log("list.size() - " + list.size();//3 console.log("list.get(0) - " + list;//1 }
ãã¡ããããã®äŸã¯å®å šã«çŸå®çãªåæã§ã¯ãããŸããããã¡ãœãããåŒã³åºãããŠããŒã¿ãåä¿¡ãããããšã¯æããã§ãã
htmlãããŒããããšãã«ãã¢ããªã±ãŒã·ã§ã³ãžã®ãªã³ã¯ãWindowãªããžã§ã¯ãã«çŽæ¥è¿œå ã§ããŸãã
JSObject windowObject = (JSObject) webView.engine.executeScript("window"); windowObject.setMember("app", this);
JavaScriptã³ãŒãããJavaã¡ãœãããåŒã³åºã-
app.addData($("my-input").val());
ããé©åãªïŒããå®å šãªïŒã¢ãããŒãã¯ãJavaç°å¢ã§ã¢ã¯ã»ã¹ãå¶éããJavaScriptãã¢ããªã±ãŒã·ã§ã³ã§ãèš±å¯ããããã¡ãœããã®ã¿ãåŒã³åºãããšãèš±å¯ããç¹å¥ãªãªããžã§ã¯ããäœæããããšã§ãã
windowObject.setMember("app", new JSBridge(){ public myMethod(){ MyApp.this.myMethod(); } });
JSãã¢ã©ãŒãããä»ãããã³ãã«ã®å¥ã®äŸã ãããŒããhtml-ã¢ããªã±ãŒã·ã§ã³ã®å®å šåæåããã£ããããå¿ èŠããããŸããã ä»ã®ãã¹ãŠã®æ¹æ³ã¯ããã»ã©ä¿¡é Œã§ããŸããã§ããã ç§ãã¡ã¯äœãããŸããã
JavaScriptã§jqueryã䜿çšããŠéåžžã©ããïŒ
$(function(){ alert("command:ready"); });
Javaã§ã¯ãwebview.engineã«ãonAlertããã³ãã©ãŒãè¿œå ããŸãããããã§ãHTMLã確å®ã«ããŒãããã³åæåãããããšãããããŸããã
engine.onAlert = new EventHandler<WebEvent<String>>() { @Override void handle(WebEvent<String> event) { if("command:ready".equals(event.getData())){ //TODO: initialize } } }
ã³ãŒãã®åå©çš
ã¢ãã€ã«éçºçšã®ã³ã³ãã¥ãŒã¿ãŒã®ã¢ããªã±ãŒã·ã§ã³çšã«äœæããã³ãŒããåå©çšããäºå®ã§ãã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒobjective-c / javaïŒã§ã¯ãã»ãšãã©ã®æ©èœãçšæãããŠããWebviewã«åºã¥ããŠã³ã³ããŒãã³ããäœæããŸãã
JavaFXã§HTML / JSãæäœãããšãã«ãã©ã®ãããªå°é£ã«ééããŸãããïŒ
æåã®ãã®ã ããã¥ã¡ã³ãã®ããŒãã©ã€ããµã€ã¯ã«ã ã¡ãœããã¯ãããŒãžãå®å šã«ããŒããããåŸã«ã®ã¿JSã§åŒã³åºãããšãã§ããŸããããã¥ã¡ã³ãã§ã¯ãJavaã§ããŒãžç¶æ ãå€åããã€ãã³ãã远跡ããæ¹æ³ãææ¡ããŠããŸãã ãã®ã¢ãããŒãã¯éåžžã«ãã°ãå€ãã£ãã åã«è¿°ã¹ãããã«ãhtmlåŽã§ã®ãããŒããã€ãã³ãã®æãšJavaåŽã§ã®ãã¢ã©ãŒããã®ã€ã³ã¿ãŒã»ããã«ããããã®åé¡ã¯è§£æ±ºããŸããã
ç§ãã¡ã®è¡ã飲ãã 2çªç®ã®åé¡ã¯ãåæã«webviewãæã€ç°ãªãã³ã³ããŒãã³ãã®ããã€ãã®JavaScripté¢æ°ã®åŒã³åºãã®äžå ·åã§ãã ããã«ããã®ãããªãã°ã¯ããæè¿çºçããJavaFXã®Webkitãšã³ãžã³ã«è¿œå ãããæé©åã«éåžžã«äŒŒãŠããŸãã ãããã®å Žåã§ããJavaScriptã®ç¡éååž°ã«é¢ãããšã©ãŒãæåéããŒãããååŸã§ããŸãã ãã®åé¡ã¯éåžžã«ç°¡åã«è§£æ±ºãããŸã-Platform.runLaterïŒïŒã䜿çšããŠJavaããã®JavaScriptåŒã³åºããã©ããããŸãã
3çªç®ã®åé¡ã ãããã°ãšãã®ã³ã°ã
äœæ¥ã®æåã®æ®µéã§ããããã¿ã€ãã³ã°ããããHTML / JSã®ã¿ã§äœæ¥ããå Žåããã©ãŠã¶ãŒã§ç°¡åã«ãã¹ãã§ããŸãã Javaãšã®çµ±åã®æ®µéã§ãé©åãªç°å¢ãªãã«ã³ãŒããæ©èœããªããªãã ãã§ãã ãŸããJavaScriptã®æ©èœããã¹ãããããã«ãJavaã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ããŸããŸãå§ããŠããŸãã ãŸããJavaã¢ããªã±ãŒã·ã§ã³ã®ãã«ããšãã®èµ·åã¯ãæ°ç§åŸ ã£ãŠããŸãã ãã®ãããªé·ãè² è·ãé¿ããæéãç¡é§ã«ããªãããã«ã©ã®ãããªææ³ã䜿çšããŸãããïŒ
ã·ã³ãã«ã§æçœãªlet-ããŒã®çµã¿åããã䜿çšããŠããŒãžã®ããªããŒãããè¿œå ããŸãã ä¿®æ£ãããHTML / CSS / JS-F5ããŒãæŒãã-WebViewã³ã³ãã³ãããªããŒããããŸããïŒ
$(document).keydown(function (e) { if(e.keyCode == 116 /*F5*/){ location.reload(); } });
ãã ããç°¡åãªãæŽæ°ãã«å ããŠããã°ã衚瀺ããå¿ èŠããããŸãã
ããªãç°¡åãªè§£æ±ºçã¯ãFireBug Liteãè¿œå ããããšã§ãã-
<script type='text/JavaScript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
ãããŠãã¡ãããã¢ããªã±ãŒã·ã§ã³ããåŒåžãããHTML / JSã®ã©ã€ãã³ãŒãã£ã³ã°ãç²åŸãããšããã«ãCOLTã䜿çšããŠCOLTãéçºãå§ããŸããã çŸæç¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ©èœã¯ã»ãšãã©ã®å Žåãã«ããŒããŠããŸã-FireBug Liteã¯ããå¿ èŠãããŸããã ãã°ãã©ã€ãã¢ããããŒãããªã¢ãŒããã¹ããã©ã€ãã³ãŒãã£ã³ã°ã ç§ãã¡ã®æèŠã§ã¯ãã©ã€ãã³ãŒãã£ã³ã°ã¯ãããã°ã«åã£ãŠä»£ããããšãã§ããŸããããŠãŒã¶ãŒããã®è³ªåããããããã¬ãŒã¯ãã€ã³ãã䜿çšããå®éã®ãããã°ããå°ç¡ãã«ããŸãã
æ¥ç¶æ¹æ³ 次ã®ã³ãŒããhtmlããã¥ã¡ã³ãã«è¿œå ããã ãã§ã
var url = "http://<address>:<port>/webview.html"; if (location.href != url) { location.href = url }
urlã¯ãCOLTãå€æãããããŒãžãèµ·åããã¢ãã¬ã¹ã§ãã 圌ãšç¥ãåãã®ã¯ç°¡åã§ãã COLTãããžã§ã¯ããäœæããããŒãžãžã®ãªã³ã¯ïŒãã¡ã€ã³ããã¥ã¡ã³ããïŒãæå®ããŠã»ãã·ã§ã³ãéå§ãããç·è²ã®çš²åŠ»ããã¯ãªãã¯ããŸãã
ããŒãžããã©ãŠã¶ã§éããŸãã ããŒãžã«ã³ããŒããŠãJSã³ãŒãã«è²Œãä»ããŸãããã ãã©ãŠã¶ãŠã£ã³ããŠãéããŸãã JavaFXã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã ããŒãžã®ã³ã³ãã³ããå€æŽããããšããŠããŸããJavaScriptãã©ã€ãã³ãŒãã£ã³ã°ã¯JavaFXã¢ããªã±ãŒã·ã§ã³ã§çŽæ¥åäœããŸãã
æ°ããããŒãžã§ã³ã§ã¯ãèšå®ã®ã詳现ããããã¯ã§ããã®ã¹ããããã«ç¹å¥ãªããã¹ããã£ãŒã«ããè¿œå ããŸããã ãããžã§ã¯ããéå§ããã«ããã®ã³ãŒããCOLTèšå®ããçŽæ¥ã³ããŒã§ããŸãã
COLTãŠã£ã³ããŠã«ãã°ã衚瀺ãããŸãã ãããã£ãŠã次åã³ã«ãããã©ãŠã¶ãŒãéããã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åããå Žåããã©ãŠã¶ãŒã§ã¯ãªãã³ã³ãœãŒã«ããèµ·åããããã«éžæã§ããŸãã ãã®ãããžã§ã¯ãã§ã¯ãå®è¡æ§æIDEAã®åºåããããã¹ããã³ããŒãããã®åŒã³åºããCOLTã³ã³ãœãŒã«ã©ã³ãã£ãŒã«è¿œå ããŸããã
ãç·ã®çããã¯ãªãã¯ãããšãJavaã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠãèµ·åããŸãã
äžè¬çã«ãHTMLããã©ã€ãããŒãžãžã®ãªãã€ã¬ã¯ãã¢ãããŒãã¯æ®éçã§ãã ããšãã°ãPhoneGapã§ãããŸãæ©èœããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ã¢ãã€ã«ããã€ã¹ã§å®è¡ããïŒäž»ãªããšã¯ãããã€ã¹ãåãããŒã«ã«ãããã¯ãŒã¯äžã«ããããšã§ãïŒãåèµ·åã®å¿ èŠãªãæŽæ°ãé ä¿¡ãããŸãã ã¢ã¯ã·ã§ã³ã®é åºãèŠããŠããå¿ èŠããããŸã-WebViewãããå Žæãªãã©ãã§ãé©çšã§ããŸãã
ã³ãŒãå€æŽã€ãã³ãã«ãã³ãã©ãŒé¢æ°ãè¿œå ããããšããå§ãããŸãã
//@code-update function live(){ console.log("live update"); }
@ code-update泚éã¯ãASTå€æã«ãã£ãŠã€ã³ã¿ãŒã»ããããããªã¹ããŒãã³ãŒãæŽæ°ã€ãã³ãã«è¿œå ãããŸãã
ãã®ãããªãã³ãã©ãŒã䜿çšããå žåçãªã±ãŒã¹ã¯ãã³ãŒãå ã®é¢æ°ïŒã€ãŸããéåžžFireBugã³ã³ãœãŒã«ã«æžã蟌ããã®ïŒãåŒã³åºãããšã§ãã ã¢ããªã±ãŒã·ã§ã³ãæ¢ã«å®è¡ãããŠãããšãã«ãå€ãå€æŽããããé¢æ°ãåŒã³åºãããã§ããŸãã ä¿åãããã³ãŒããè¿œå -ã³ãŒããå®è¡ãããŸãã
ããã«ãã³ãŒããåæ¢ããããšãªãããå®è¡æãã«å€ãç¥ãå¿ èŠãããããŒã¿ãããã¬ãŒã¹ãããŠè¡šç€ºãããšäŸ¿å©ã§ããã³ã³ãœãŒã«ã«è¡šç€ºããã ãã§ãã
ã°ã«ãŒãŽã£ãŒ
ãŸãããã®èšäºã®ç¯å²ãããè¶ ããŠãç§ãã¡ããããžã§ã¯ãã®å®è£ äžã«äžããå ±æãããçµè«ã¯ãJavaãããç°¡æœãªèšèªã§UIãæžãæ¹ãè¯ããšããããšã§ãã ããã«ã¯Groovyã䜿çšããéåžžã«æºè¶³ããŠããŸãã ã³ãŒãã®éã¯10åã®1ã«åæžãããXMLãšãã¡ã€ã«ã·ã¹ãã ã®åŠçã1æ¡ç°¡çŽ åãããŸããã ãã€ã³ãå¯èœãªããããã£ãäœæããASTå€æãå€æã«ããããµãŒãã¹ãã³ã³ãããŒã©ãŒã«ããã¯ã¹ããåçŽãªããŒã¿ã®ãã€ã³ãå¯èœãªã©ãããŒãçæã§ããŸããã ãªã©ãªã©ã åŒã°ãããã®ããªããã°ãªããŸããã Groovy for JavaFXã®äœ¿çšã«ã€ããŠã¯ã å¥ã®èšäºãæžããŠããŸã ã
èšç»
ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®éçºã§äœ¿çšããã¢ãããŒãã§ãã¢ãã€ã«éçºãžã®é©çšãéå§ããŸããã PhoneGap + COLTã䜿çšããŸãããå®éã«ã¯JavaFX + HTML + COLTãšéãã¯ãããŸããã
ãã¹ã¯ããããããžã§ã¯ãã§æ¢ã«çšæãããŠãããã®ã®å€ããæ¢ã«èç©ãããŠãããããå¥ã®ãã©ãããã©ãŒã ã§ã¯ãªãPhoneGapãéžæããŸãããããããåã³å¥ã®ãã©ãããã©ãŒã ã«æžãçŽãããšã¯éçŸå®çã§ããã ã¢ããªã±ãŒã·ã§ã³ã§PhoneGapãæŸæ£ããå¿ èŠãããå Žåãã¢ããªã±ãŒã·ã§ã³ã®äžéšãããã€ãã£ããã«æžãæããŸãããHTML / JSã§èšè¿°ããããã¹ãŠã®æ©èœã倱ãããšã¯ãããŸããã ãããã¯ç°ãªãæ¹æ³ã§éå§ããã ãã§ãã
Codeorchestra.comãããžã§ã¯ããµã€ã