2

私は現在 GWT プロジェクトに取り組んでおり、外部 JavaScript ファイルで使用する必要があります。現在、両方が正常に動作することを確認するためのテスト プロトタイプを作成しています。

実行してコンパイルすると、呼び出されたイベントからブラウザにコンソール ログが表示されます。ただし、GWT Java メソッドは呼び出されていません。

$entry多くのシナリオを試した後、からラッパーを削除するexportStaticMethods()と、逆のことが起こることにも気付きました。System.outJava コードで s が呼び出されているのがわかりますが、ブラウザの JavaScript からのコンソール ログは呼び出されていません。

動作の原因を突き止めようとしていますが、見落とした小さな欠けている部分がある場合は.

js から Java メソッドを呼び出すための GWT JSNI ドキュメントを既に確認し、StackOverflow に関する他の関連する質問から解決策を見つけようとしました。

GWT と Java 側

onModuleLoad()クラスのメソッドに入り、EntryPointという静的メソッドを追加しましたexportStaticMethods()PokePingClass.java以下のファイルも作成しました。

EntryPointClass.java

public class EntryPointClass implements EntryPoint {

    @Override public void onModuleLoad() {
        exportStaticMethods();
        // load application here.
    }

    public static native void exportStaticMethods() /*-{

        $wnd.pingApp = $entry((function) {
                           @com.application.PokePingClass::pingApp()();
                       });

        $wnd.pokeApp = $entry((function) {
                           @com.application.PokePingClass::pokeApp()();
                       });
    }-*/
}

PokePingClass.java

public class PokePingClass {

    public static void pokeApp() {
        System.out.println("pokeApp() called");
    }

    public static void pingApp() {
        System.out.println("pingApp() called");
    }
}

HTMLとjs

.htmlプロジェクトのファイルに、ファイルdivと同様にid「pokePing」の隠し要素を追加しましたpokeping.js

<html>
    <head>
        .
        . <!-- other stuff -->
        .
        <script type='text/javascript' src='pokeping.js</script> 
    </head>

    <body>
        .
        . <!-- other stuff -->
        .
        <div id="pokePing" style="visibility: hidden;"></div>
    </body>
</html>

pokeping.js

$(document).ready(function) {

    var $pp = $('#pokePing');

    var pokeApp = function() {
        console.log("app handling poke event");
        window.parent.pokeApp();
    }

    var pingApp = function() {
        console.log("app handling ping event");
        window.parent.pingApp();
    }

    $pp.trigger('pokeApp');
    $pp.trigger('pingApp');
}
4

2 に答える 2

0

同様の投稿を見つけましたが、キーは、JSNI 関数でメソッド呼び出しを実際に返すことでした。その後、すべてがうまく機能します。

public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry((function) {
                       return @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry((function) {
                       return @com.application.PokePingClass::pokeApp()();
                   });
}-*/
于 2017-02-17T15:39:18.293 に答える