2012-03-07 31 views
6

Trong lớp Display Object, tôi có mọi thứ được bao gồm ngoại trừ các sự kiện. Tôi không thể tìm ra mô hình và thực sự cần một ví dụ.Làm cách nào để bọc một cuộc gọi lại bằng các loại Lớp phủ JavaScript (GWT)?

Trong JavaScript, bạn tạo một callback cho đối tượng như thế này:

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

tôi đã quấn tham số Mouse Event:

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... 
} 

Đối tượng hiển thị sử dụng Pattern Overlay tương tự. Làm thế nào tôi có thể viết một cuộc gọi lại trong java và chuyển nó qua cho JSO? Vui lòng cung cấp một ví dụ nếu bạn có thể. :)

+0

Tôi không hoàn toàn chắc chắn lý do tại sao bạn đang sử dụng lớp phủ JavaScript. Bạn đã thử GwtEvent và một HandlerManager cho các sự kiện nhấp chuột của bạn chưa? Tôi có thể giải thích nếu cần. –

+0

EaselJS là thư viện để tương tác với canvas. Gọi lại được gọi bởi công cụ EaselJS khi một phần cụ thể của canvas được nhấn.Rất tiếc, tôi không thể sử dụng GwtEvent vì DisplayObject không phải là phần tử trang. – LoneWolf

+0

Tôi hiểu, tôi sẽ phải kiểm tra xem bản thân mình –

Trả lời

7

Chỉnh sửa trước khi đăng: Tôi đã viết câu trả lời này mà không thực sự cố gắng xem lý do tại sao bạn đang cố gắng làm điều này, với giả định rằng bạn đang sử dụng một số sự kiện không phải trình duyệt. khá độc đáo và nếu bạn muốn có nhiều dữ liệu hơn từ cá thể NativeEvent, bạn có thể viết các phương thức JSNI trong các lớp của riêng bạn để có quyền truy cập vào nó hoặc thêm lớp con NativeEvent để thêm các phương thức khác và .cast() vào lớp học của bạn. Thêm trình xử lý vào tiện ích con bằng cách sử dụng phương thức Widget.addDomHandler và lớp con MouseEvent thích hợp để nhận phiên bản loại.


Trong JavaScript, callbacks chỉ là các hàm sẽ được gọi khi có điều gì đó xảy ra. Trừ khi được chỉ định cụ thể nơi chúng được truyền vào, chúng thường sẽ được gọi trên ngữ cảnh chung, chứ không phải trên một cá thể đối tượng cụ thể.

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

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

Để gọi một chức năng trên một thể hiện (tức là làm cho nó một phương pháp gọi), người ta có thể quấn mà gọi trong một chức năng mà không cần một ví dụ:

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(); 

Trong Java, một không thể tham chiếu cụ thể đến một phương thức (không có sự phản chiếu), nhưng chỉ cho các cá thể đối tượng. Cách dễ nhất để xây dựng một cuộc gọi lại đơn giản là thực hiện một giao diện và mã nhận cuộc gọi lại nhận một cá thể của giao diện và gọi phương thức đã định nghĩa.

GWT khai báo giao diện Command cho hàm zero-arg và giao diện chung cho các trường hợp có thể vượt qua hoặc không thành công, với một generic arg cho mỗi tùy chọn. Hầu hết các trình xử lý sự kiện trong GWT chỉ định nghĩa một phương thức, với dữ liệu cụ thể được truyền vào phương thức đó.

Chúng tôi cần sử dụng tất cả kiến ​​thức này để chuyển các cá thể Java, có chức năng gọi, vào JavaScript và đảm bảo chúng được gọi trên đúng cá thể. Ví dụ này là một hàm lấy một cá thể Callback và sử dụng JSNI kết thúc cuộc gọi đến JS.

// 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 
     [email protected]::onSuccess(Ljava/lang/String;)("success!"); 
    }; 
    doSomethingWith(callbackFunc);//something that takes (and presumably calls) the callback 
}-*/; 

Một mảnh cuối cùng - để cho GWT của xử lý lỗi và lập kế hoạch làm việc một cách chính xác, điều quan trọng là để bọc các cuộc gọi trở lại để java trong $ entry - mà dòng cuối cùng thực sự nên

doSomething($entry(callbackFunc)); 
+0

Cảm ơn bạn đã phản hồi rất nhiều thông tin này. Tôi vui mừng thông báo rằng tôi đã đính kèm thành công các sự kiện nhấp chuột! Nhiều đánh giá cao – LoneWolf

+0

eclipse than phiền về onSuccess (Ljava/lang/String;) ("success!"); nhưng tôi nghĩ rằng có thể được sử dụng onSuccess (Ljava/lang/Object;) ("thành công!"); thay vì –

+1

Cảm ơn @LorenzoSciuto, bạn là chính xác, tôi nên đã bỏ qua các generics và đi cho Object. Một tùy chọn khác là sử dụng '*', có nghĩa là "chỉ có một phương thức với tên này, vì vậy bạn không thực sự cần các kiểu tham số để tìm ra nó". –

Các vấn đề liên quan