1

外部の JavaScript ライブラリ (クライアント、サーバー、および共有と同じレベルのパブリック フォルダーに残したもの) から Javascript を実行する必要があります。その JavaScript の出力 (ChemDoodle JavaScript ライブラリによって生成されたキャンバス) が SmartGWT VLayout 内に表示される必要があります。最初に、javascript コードを HTMLFlow オブジェクトに追加してから、HTMLFlow を VLayout に追加しようとしましたが、HTMLFlow は Javascript コードを実行しません (生成された HTML を別のブラウザー ウィンドウにコピー アンド ペーストすると動作します)。私が現在試みているのは、JSOHelper.eval("java script code here") を使用して JavaScript コードを評価し、JavaScriptObject を生成することです。ただし、JavaScript の実行結果を VLayout 内に「配置」する方法がわかりません。

String javaScriptCode = 
"var viewerCanvas = new ChemDoodle.ViewerCanvas('viewerCanvas', 200, 200);\n" +
"var molFile = 'contentToBeDrawnByChemDoodleCanvas';\n" +
"var moleculeToShow = ChemDoodle.readMOL(molFile);\n" +
"viewerCanvas.loadMolecule(moleculeToShow);\n";

HTMLFlow hflow = new HTMLFlow("<script>\n"+javaScriptCode+"</script>");
vLayout.addMember(hflow);

ただし、前述したように、HTMLFlow は >script\> ブロックを実行しないため、これは機能しません (ブール値の設定 setEvalScriptBlocks(true) は、HTMLFlow から呼び出された他の URL にのみ適用されます)。したがって、JSOHelper クラスを使用すると、次のことができます。

JavaScriptObject jso = JSOHelper.eval(javaScriptCode); // without the <script> tags
// but the following line doesn't work, probably because jso is not a HTMLFlow
HTMLFlow flow2 = HTMLFlow.getOrCreateRef(jso);
// so then this doesn't work either, but I guess it shows where I want to get.
vLayout.addMember(flow2);

私はJSNIメソッドでそれを行う方法を理解しようとしていますが、そこからvLayoutを参照する方法がわかりません(javascriptで)。$doc と $win があることはわかっていますが、そこから vLayout (タブ内にあり、他のウィジェット内にあります) までの取得方法がわかりません。javascript に getElementByID メソッドがあることは知っていますが、vLayout の ID を取得する方法と、その DIV (推測) を描画されたキャンバスに関連付けて、そこに画像が表示されるようにする方法がわかりません。

そのjavascriptスニペットが実行され、結果(生成されたキャンバス)が必要な場所に表示されるようにする方法を教えてください(JSNIを使用するのが唯一の方法だと思います)。

ありがとう!

4

1 に答える 1

0

JSNI を使用して JavaScript 実装のみを処理し、すべての高レベルの操作を Java レイヤーに委譲するという、別のアプローチを採用することをお勧めします。

JSNI を理解することは非常に重要です。そのため、いくつかのドキュメントに飛び込むことから始めることをお勧めします ( JSNI に関する GWT のコーディングの基本は非常に役立ちます)。

そうは言っても、最善のアプローチは、ライブラリのインスタンス化用のネイティブ (JavaScript) スクリプトを別のファイルとして用意し、モジュール (またはアプリケーション) のファイルを介してプリロードを挿入すること.gwt.xmlです。

そのファイル内のコード スニペットを自己実行ブロックでラップすることができます (つまり(function() {...})();、前に実行されることを確認する手段として) onModuleLoad()

于 2012-03-06T19:25:46.637 に答える