0

我正在寻找提供我自己的CanvasElement类的实现。此类在 PlayN 堆栈中的HTMLGraphicsCanvas类中实例化。

这样做的理想方法是什么?我尝试了两种方法但失败了:

A) 继承 HTMLGraphics 和 HTMLPlatform?——这似乎是不可能的。

B) GWT 模块机制似乎要求我对 GWT 提供的类的自定义实现属于同一个包。以这个 XML 片段为例:

<replace-with class="com.google.gwt.dom.client.DOMImplOpera">
    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
    <when-property-is name="user.agent" value="opera"/>
</replace-with>

如果我这样做:

<replace-with class="com.domain.example.CustomCanvasElement">
    <when-type-is class="com.google.gwt.dom.client.CanvasElement"/>
    <when-property-is name="user.agent" value="opera"/>
</replace-with>

...它似乎不起作用,因为包装不同。至少这是我认为正在发生的事情。

还有其他想法吗?非常感激。

4

1 回答 1

0

好的,所以我可以回答我自己问题的 B) 部分。虽然我真的很感激关于如何提供我自己的实现的整体问题的答案。

所以我的猜测并不完全正确。根据Deferred Binding的这一部分,基本上你必须首先创建一个超类对象,特定于浏览器的对象将继承该对象。例如:

GenericBrowserObject是超类,并且可能在特定于浏览器的对象之间具有某些方法的通用实现,或者可能是所有其他(非特定)浏览器的“包罗万象”实现。

例如,假设您只想为基于 IE 和 Gecko 的浏览器提供特定的实现。

GeckoBrowserObject extends GenericBrowserObject

IEBrowserObject extends GenericBrowserObject

假设调用setStyle了一个通用方法,但它们在和GenericBrowserObject之间有不同的实现,那么您将在每个类中覆盖并提供它们自己的实现。GeckoBrowserObjectIEBrowserObjectsetStyle

操作这些对象的类需要以GenericBrowserObject这种方式实例化超类:

    GenericBrowserObject obj = GWT.create(GenericBrowserObject.class);
    obj.setStyle("whatever");

然后在您的模块文件(something.gwt.xml)中,您将拥有如下内容:

    <replace-with class="com.domain.blah.GenericBrowserObject">
            <when-type-is class="com.domain.blah.GenericBrowserObject"/>
    </replace-with>

    <replace-with class="com.domain.blah.IEBrowserObject">
            <when-type-is class="com.domain.blah.GenericBrowserObject"/>
            <any>
                    <when-property-is name="user.agent" value="ie6"/>
                    <when-property-is name="user.agent" value="ie8"/>
            </any>
    </replace-with>

    <replace-with class="com.domain.blah.GeckoBrowserObject">
            <when-type-is class="com.domain.blah.GenericBrowserObject"/>
                    <any>
                            <when-property-is name="user.agent" value="gecko"/>
                            <when-property-is name="user.agent" value="gecko1_8"/>
                    </any>
    </replace-with>

当 GWT 编译它时,它将通过 GWT.create 根据用户代理字符串生成正确的对象。

于 2013-02-05T17:41:09.407 回答