convert JavaScript array to Java array

1,966 views
Skip to first unread message

Toki

unread,
Aug 26, 2007, 1:20:16 PM8/26/07
to Google Web Toolkit
Hi,

How can I convert JavaScript array of elements to Java
com.google.gwt.core.client.Element[]?

The JavaScript array is create in JSNI method:
private static native Element[] getElementsBySelectorWrapper(Element
e, String selector) /*-{
var result = $wnd.Selector.findChildElements(e, [selector]);
return result;
}-*/;

Now I have exception "Cannot convert to type java.lang.Object from
JavaScript object"

Reinier Zwitserloot

unread,
Aug 26, 2007, 5:33:50 PM8/26/07
to Google Web Toolkit
It is impossible to create java arrays in JSNI. You must call on an
external non-JSNI method from within your JSNI code to produce the
array, then load it piece by piece. Which is incredibly sucky, but
that's life. Possibly you CAN return Object[] from JSNI, and then do
the conversion into an Element[] array using java code, but you'd have
to check that, I'm not sure.

Rick

unread,
Aug 26, 2007, 7:50:30 PM8/26/07
to Google Web Toolkit
Could you use java.lang.Array to do this? Or is that not accessible
from javascript?

> > JavaScript object"- Hide quoted text -
>
> - Show quoted text -

Toki

unread,
Aug 27, 2007, 5:09:45 AM8/27/07
to Google Web Toolkit
Do you mean using java.lang.reflect.Array?
I'm trying but I have "Expected a valid parameter type signature in
JSNI method reference".

private static native Object[] getArray() /*-{
var clazz = @java.lang.Object::getClass()();
var result = @java.lang.reflect.Array::newInstance(Ljava/lang/Class<?
>;[I)(clazz, 10);
return result;
}-*/;

I don't understand where is the problem?

Toki

unread,
Aug 27, 2007, 5:49:24 AM8/27/07
to Google Web Toolkit
I have made it. Thanks you all for help!

private static Element[] createElements(int len) {
return new Element[len];
}

private static void setElement(Element[] container, int pos, Element
value) {
container[pos] = value;
}

private static native Element[] getElementsBySelectorWrapper(Element
e, String selector) /*-{
var result = $wnd.Selector.findChildElements(e, [selector]);

var resultSize = result.length;
var elements =
@main.client.helpers.PrototypeHelper::createElements(I)(resultSize);

for(var i=0; i<resultSize; ++i) {
var element = result[i];
@main.client.helpers.PrototypeHelper::setElement([Lcom/google/gwt/
user/client/Element;ILcom/google/gwt/user/client/Element;)(elements,
i, element);
}

return elements;
}-*/;

Reinier Zwitserloot

unread,
Aug 27, 2007, 8:20:13 AM8/27/07
to Google Web Toolkit
Glad to see you've fixed it, Toki.

For future reference, java.lang.reflect.* is 100% invalid in GWT code
- just like every other class that isn't in java.util and java.lang
with the exception of java.io.Serializable.

Reply all
Reply to author
Forward
0 new messages