Create Canvas widget from CanvasElement

161 views
Skip to first unread message

Julian

unread,
Aug 11, 2011, 4:06:51 PM8/11/11
to google-we...@googlegroups.com
I want to wrap a CanvasElement (<canvas> in HTML) in an Canvas widget.

Many widgets (e.g. Label) have a static method SomeWidget.wrap(Element) for wrapping an existing DOM element.
I imagine Canvas does not feature such a method because not all browser support <canvas> and therefore the user should be forced to go through createIfSupported().

Unfortunately the constructor in Canvas is private, which means that Canvas can not be subclassed. (There isn't any constructor available in the derived class.)

Code snippets of createIfSupported and the constructor in Canvas:

  public static Canvas createIfSupported() {
    // check if canvas is supported; if it is not supported: return null
    return new Canvas(element);
  }

  private Canvas(CanvasElement element) {
    setElement(element);
  }

I ended up copying the Canvas class and making the constructor public.

Is there a better way to do this?
If not, what is the reasoning behind it (besides that it might not be supported)?

I am using version 2.4.0.rc1.

Thanks,
Julian

Tomasz Gawel

unread,
Aug 11, 2011, 8:38:33 PM8/11/11
to Google Web Toolkit
i suppose it's a bug . in majority of widgets constructor with Element
argument is protected.
even a comment in source code of canvas it should be protected not
private:

/**
* Protected constructor. Use {@link #createIfSupported()} to create
a Canvas.
*/
private Canvas(CanvasElement element) {
setElement(element);
}

i think you should raise the issue in gwt-contributors group.

karim33

unread,
Aug 12, 2011, 3:38:54 AM8/12/11
to Google Web Toolkit
Hi Julian,

I work with GWT 2.3 and i just see in the documentation :
(http://google-web-toolkit.googlecode.com/svn/javadoc/2.3/com/google/
gwt/dom/client/CanvasElement.html)

constructor
protected CanvasElement()

It means that you can derive your own class for CanvasElement.
Adding it in a GWT container works for me.

I agree with you : I don't understand why there is also a Canvas
class, and why the constructor is private ?

In my opinion, Google is perfectionnist, and has provided a cross-
browser test class to check if <canvas> is supported by client
browser, in order to let the developper to test and take a decision if
there is no browser support. May be that's why thi class exists. I
don't think it's a bug as Thomas says.

Regards

Karim Duran

Julian

unread,
Aug 12, 2011, 5:13:38 AM8/12/11
to google-we...@googlegroups.com

constructor
protected CanvasElement()

It means that you can derive your own class for CanvasElement.
Adding it in a GWT container works for me.

I agree with you : I don't understand why there is also a Canvas
class, and why the constructor is private ?


Canvas is a Widget (derives from FocusWidget).
CanvasElement is just a wrapper around the DOM element <canvas> (derives com.google.gwt.dom.client.Element).
To be precise, CanvasElement is not even a wrapper it is a JavaScriptObject which means that you can not create it in Java (by calling a constructor).
Instead, we have to use Document.get().createCanvasElement() which does its work by calling a JSNI method.
I want the widget so that I can do all the event handling in Java (FocusWidget implements tons of Has*Handlers interfaces). 

confile

unread,
Mar 11, 2014, 7:48:33 PM3/11/14
to google-we...@googlegroups.com
Hi I am working on a new Kineticjs GWT wrapper here: https://github.com/confile/gwt-kinetic

If someone wants to join my project please contact me.




Am Montag, 22. Oktober 2012 14:38:00 UTC+2 schrieb Maik Riechert:
I stumbled upon the same thing today.

I'm a contributor to KineticGWT which is a JSNI wrapper around the KineticJS library. In this library, the canvas elements are created by the library itself and I only get them. So I thought, when doing something like layer.getCanvas() it would be best to use the Canvas widget, but still, as of 2.5.0rc2 the constructor is private and there's no wrapper method. This sucks! I'll see if it's already been mentioned in gwt-contributors.

Cheers
Maik
Reply all
Reply to author
Forward
0 new messages