在托管模式下启动GWT时,可以在applet和GWT应用程序之间进行通信(反之亦然)?我认为不,因为applet只能与JavaScript通信(通过LiveConnect),但GWT的托管模式不会产生任何JS ......
答案 0 :(得分:2)
虽然托管模式在jvm中运行部分代码,但是所有jsni / dom / native调用都被委托给浏览器,所以在你的情况下应该没有任何区别,你可以调用js来与你的applet通信。当然,不可能的是在同一个调试器会话中调试gwt和applet代码。
要从GWT调用applet方法,您需要一个jsni块,如:
private native Object callFoo(String param) /*-{
var appplet = document.getElementById('myapplet');
return applet.foo(param);
}-*/
要从您的applet调用GWT代码,您需要另一个jsni方法来导出您的gwt代码(请注意,您必须在入口点调用一次)
private native void exportBar() /*-{
window.bar = function(param) {
return @com.examle.MyClass::myStaticMethod(*)(param);
}
}-*/
无论如何,我知道与applet通信的最佳方法是使用gwtai,因为所需的所有样板代码(包装器和jsni)都是自动生成的。
Gwtai,在托管模式下工作没有问题,虽然他们在他们的网站上说don't expect it to be stable
,它足够稳定,我已经在生产中使用了很长时间。
GwtAI提供易于使用的跨浏览器Java Applet与Google Web Toolkit(GWT)项目的集成。 GwtAI包含许多实用程序和辅助类,例如自动创建包装器小部件和与Java小程序通信的机制。
您需要下载两个文件(GwtAI-Client.jar和GwtAI-Core.jar)并包含在项目的类路径中,然后修改您的.ui.xml
文件以继承gwtai,您将能够开始编码。
首先,您必须在gwt-code中定义applet接口,以便使用延迟绑定的GWT编译器创建通信类实现。
@ImplementingClass(MyClassImpl.class)
@Height("60") @Width("350") @Archive("GwtAI-Client.jar, MyApp.jar")
public interface MyApplet extends Applet {
public Object foo();
}
然后你必须在你的applet代码中实现这个接口。
public class MyClassImpl extends JApplet implements MyApplet {
public Object foo(){
return "Hello";
}
}
最后使用你的gwt应用程序中的applet
MyApplet applet = GWT.create(MyApplet.class);
Object foo = applet.foo();
阅读GettingStarted指南以获取更多信息。