Я расширяю собственный JsType, который я объявил, на основе snap svg.Мой подкласс TestWidget2 расширяет собственный JsType Rect и имеет дополнительные объявленные методы, такие как «move».
Я создаю экземпляр с помощью метода Js utils Js.uncheckedCast ().Когда я пытаюсь вызвать метод move из моего подкласса, я получаю следующую ошибку:
Uncaught TypeError: testWidget2_0_g$.move_0_g$ is not a function
Snap svg имеет метод rect (x, y, width, height, rx, ry) для создания прямоугольников svg.У меня есть JsType, который выглядит следующим образом:
@JsType(isNative = true, namespace = "Snap")
public class Paper extends Element {
public native Element circle (float x, float y, float r);
public native Rect rect (float x, float y, float width, float height, float rx, float ry);
Мой Test2Widget:
public class TestWidget2 extends Rect {
public Paper getSvg() {
return svg;
}
public void setSvg(Paper svg) {
this.svg = svg;
}
private Paper svg;
/**
* tests moving with current matrix transformation
* @param x
* @param y
*/
public void move (int x, int y) {
au.com.guml.ui.components.common.client.jsni.Matrix matrix = JSNI.getScreenCTM(svg.getNode());
Point point = JSNI.createSVGPoint(svg.getNode());
point.setX(x);
point.setY(y);
point = point.matrixTransform(matrix.inverse());
Attributes attributes = attr();
attributes.setX(point.getX());
attributes.setY(point.getY());
attr(attributes);
}
}
Я также пытался сделать TestWidget2 нативным JsType, но затем я попытался вызвать методы Snapна него, как attr (), и затем я получаю ту же ошибку.
Я предполагаю, что это потому, что Snap ничего не знает о моем классе TestWidget2, когда он создает прямоугольник svg.Я не понимаю внутреннюю работу JsInterop.
Я не знаю, как решить эту проблему, но, наверное, мне нужно понять, как JsInterop конвертирует элементы Dom?Любая помощь очень ценится.
ОБНОВЛЕНИЕ: я вручную скопировал, используя jsni, атрибуты из привязанного нативного объекта в мой подкласс через конструктор.См. Метод конвертирования ниже:
public SnapWrapper(Paper svg) {
this.svg = svg;
Rect rect = svg.rect(0,0, 500, 500, 0,0);
convert(this, rect);
}
@Override
public final native void convert(io.ease.test.model.client.Element e,
Rect rect) /*-{
for (var attr in rect) {
e[attr] = rect[attr];
}
}-*/;
Хотя это работает, похоже, это побеждает всю цель использования JsInterop и аннотаций.Мне кажется, что в JsInterop есть ошибка, и она должна справиться с этим простым сценарием.В этом случае я предполагаю, что я делаю что-то неправильно.