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

时间:2013-01-30 19:36:39

标签: gwt playn

我希望提供自己的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>

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

例如,假设您只想要基于IE和Gecko的浏览器进行特定实现。

GeckoBrowserObject extends GenericBrowserObject

IEBrowserObject extends GenericBrowserObject

假设在setStyle中有一个名为GenericBrowserObject的常用方法,但它们在GeckoBrowserObjectIEBrowserObject之间有不同的实现,那么您将覆盖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基于用户代理字符串生成正确的对象。