外部の 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を使用するのが唯一の方法だと思います)。
ありがとう!