0

只是为了测试,我尝试在我的 playn 项目中使用 com.google.gwt.user.client.Window 包中的 Window.alert() 函数。但是当我尝试运行程序时,我收到如下错误消息:

“原因:java.lang.UnsupportedOperationException:错误:GWT.create() 只能在客户端代码中使用!例如,不能从服务器代码中调用它。如果您正在运行单元测试,请检查您的测试用例是否扩展GWTTestCase 并且 GWT.create() 不是从初始化程序或构造函数中调用的。”

我真的不明白。在我的 playn 项目中,只有客户端代码在使用。所以有什么问题?

4

1 回答 1

0

GWT.create() 目前在 gwt trunk 中的纯 java 中受支持。我自己在一个 playn 项目中使用它{尽管有一点小故障:强制 GWT 编译器停止修剪无效的 CompilationUnits }。

如果您下载并构建主干,您将能够通过为导致错误的任何类注册 ClassInstantiators 来规避 GWT.create() 问题。在这种情况下,Window 类有一个 WindowImpl 的静态实例,当 jvm 遇到 Window 类时会抛出此错误。如果为 WindowImpl 注册 ClassInstantiator,则不会发生这种情况。不幸的是,Window.alert 方法直接使用原生 js,所以它可能仍然会轰炸你。

如果您不知道如何/想要从主干构建 gwt,请给我发送电子邮件,我可以将罐子发送给您。如果您仍然对 .alert() 作为本机方法有疑问,请告诉我,我将创建一个自定义主干构建,将 .alert() 延迟到 WindowImpl 单例中,这样您就可以让它做一些有意义的事情,比如弹出一个警报消息;-}

如果您喜欢冒险,请下载 gwt trunk,进入 Window,将静态警报方法复制到 WindowImpl 上的实例级方法中,将原始方法委托给 WindowImpl,然后在您的 java 代码中调用 ServerGwtBridge.register(WindowImpl.class , new ClassInstantiator(){...}),并返回你想要的任何实现 .alert() 在 java 和 android 中。

于 2012-05-31T16:01:14.423 回答