6

Display Objectクラスでは、イベントを除いてすべてをラップしています。パターンがわからないので、例が必要です。

JavaScriptでは、次のようにオブジェクトのコールバックを作成します。

displayObject.onPress = function(event) {
    $wnd.alert("object pressed");
}

マウスイベントパラメータをラップしました:

public class MouseEventImpl extends JavaScriptObject {
    protected MouseEventImpl() {}

    public static native MouseEventImpl create(String type, int stageX, int stageY, DisplayObjectImpl target, JavaScriptObject nativeEvent) /*-{
        return new $wnd.MouseEvent(type, stageX, stageY, target, nativeEvent);
    }-*/;

    ...other methods excluded...
}

public class MouseEvent {
    private MouseEventImpl impl;

    public MouseEvent(String type, int stageX, int stageY, DisplayObject target, JavaScriptObject nativeEvent) {
        this.impl = MouseEventImpl.create(type, stageX, stageY, target.getOverlay(), nativeEvent);
    }

    ...other methods excluded...
}

表示オブジェクトは同じオーバーレイパターンを使用します。Javaでコールバックを記述してJSOに渡すにはどうすればよいですか?可能であれば例を挙げてください。:)

4

1 に答える 1

7

事後編集:この回答は、ブラウザ以外のイベントを使用していることを前提として、なぜこのようなことをしようとしているのかを実際に確認することなく作成しました。インスタンスからのデータのNativeEvent場合、独自のクラスにJSNIメソッドを記述してアクセスしたり、さらにサブクラスNativeEventを記述してメソッドやクラスに追加したりでき.cast()ます。Widget.addDomHandlerメソッドと適切なMouseEventサブクラスを使用してハンドラーをウィジェットに追加し、型インスタンスを取得します。


JavaScriptでは、コールバックは何かが起こったときに呼び出される単なる関数です。渡される場所が特に指定されていない限り、通常、特定のオブジェクトインスタンスではなく、グローバルコンテキストで呼び出されます。

var callback = function() { alert("callback called!"); };

// later, in something that consumes that callback:
callback();

インスタンスで関数を呼び出す(つまり、メソッド呼び出しにする)には、インスタンスを必要としない関数でその呼び出しをラップできます。

var obj = {};
obj.name = "Me";
obj.whenSomethingHappens = function() {
    alert("my name is " + this.name);
};

// wont work, so commented out:
//var callback = obj.whenSomethingHappens;

// instead we wrap in a function
// this is making a closure (by closing over obj)
var callback = function() {
    obj.whenSomethingHappens();
};

// later, in something that consumes that callback:
callback();

Javaでは、(リフレクションなしで)メソッドを具体的に参照することはできず、オブジェクトインスタンスのみを参照します。単純なコールバックを作成する最も簡単な方法は、インターフェイスを実装することです。コールバックを受け取るコードは、インターフェイスのインスタンスを受け取り、定義されたメソッドを呼び出します。

GWTは、Command引数がゼロの関数のインターフェイスと、Callback<T,F>成功または失敗する可能性のあるケースの汎用インターフェイスを宣言し、オプションごとに1つの汎用引数を使用します。GWTのほとんどのイベントハンドラーは、特定のデータがそのメソッドに渡される1つのメソッドを定義するだけです。

この知識をすべて使用して、呼び出す関数を含むJavaインスタンスをJavaScriptに渡し、それらが適切なインスタンスで呼び出されるようにする必要があります。この例は、Callbackインスタンスを取得し、JSNIを使用してインスタンスへの呼び出しをラップする関数です。

// a callback that has a string for either success or failure
public native void addCallback(Callback<String, String> callback) /*-{
    var callbackFunc = function() {
        // obviously the params could come from the function params
        callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/String;)("success!");
    };
    doSomethingWith(callbackFunc);//something that takes (and presumably calls) the callback
}-*/;

最後の1つ-GWTのエラー処理とスケジューリングを正しく機能させるには、Javaへの呼び出しを$entryでラップバックすることが重要です-最後の行は実際には

    doSomething($entry(callbackFunc));
于 2012-03-08T04:54:59.287 に答える