如何在PlayN HTMLGraphicsCanvas中覆盖GWT提供的CanvasElement实现?

如何在PlayN HTMLGraphicsCanvas中覆盖GWT提供的CanvasElement实现?,gwt,playn,Gwt,Playn,我希望提供我自己的类实现。该类在PlayN堆栈中的类中实例化 这样做的理想方式是什么?我尝试过两种方法,但都失败了: A) 子类化HTMLGraphics和HTMLPlatform--这似乎是不可能的 B) GWT模块机制似乎要求我对GWT提供的类的自定义实现属于同一个包。以这个XML片段为例: <replace-with class="com.google.gwt.dom.client.DOMImplOpera"> <when-type-is class="com.g

我希望提供我自己的类实现。该类在PlayN堆栈中的类中实例化

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

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>

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

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

好的,我可以回答我自己问题的B)部分。尽管我非常希望能够回答关于如何提供自己的实现的总体问题

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

GenericBrowserObject
是超类,可能在特定于浏览器的对象之间有特定方法的通用实现,也可能是所有其他(非特定)浏览器的“全面”实现

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

geckobrowservObject扩展了GenericBrowserObject

IEBrowserObject扩展了GenericBrowserObject

假设在
GenericBrowserObject
中有一个名为
setStyle
的常用方法,但是
geckobrowservobject
iebrowservobject
之间有不同的实现,那么您可以在每个类中重写
setStyle
,并提供它们自己的实现

操作这些对象的类需要以以下方式实例化
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基于用户代理字符串生成正确的对象