【问题标题】:using Window.alert() in a playn project在 playn 项目中使用 Window.alert()
【发布时间】:2012-06-01 00:01:14
【问题描述】:

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

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

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

【问题讨论】:

  • 可以提供sn-p的代码吗? Window.alert 从来没有给我带来任何问题,所以我很感兴趣......
  • 更新:它可以作为 Web 应用程序正常工作,但不能作为 Java 应用程序。

标签: gwt client-side playn


【解决方案1】:

gwt trunk 中的纯 java 当前支持 GWT.create()。我自己在一个 playn 项目中使用它{尽管有一点小故障:Force GWT compiler to stop pruning invalid 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 中。

【讨论】:

  • 当然,为每个构建注册一个不同的委托服务,并在 java 或 android 弹出一个小部件时让 gwt 调用 Window.alert() 可能会更容易。然后,您将不得不运行您的呼叫以通过代理发出警报,但这可以省去黑客攻击中继线的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多