JavaFX WebViewHTML / JS-Webプラクティスを䜿甚しおデスクトップアプリケヌションを開発する

画像

アプリケヌションの基本的な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プロゞェクトサむト



All Articles