Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT小部件中的自定义事件不工作_Java_Gwt_Vaadin7 - Fatal编程技术网

Java GWT小部件中的自定义事件不工作

Java GWT小部件中的自定义事件不工作,java,gwt,vaadin7,Java,Gwt,Vaadin7,我正在为我的课程申请瓦丁。 我必须在屏幕上绘制一些地图,所以我使用gwt图形库。 我还有一些servlet正在等待请求。 当一些特定的请求到来时,地图的视图应该改变。 它引导我准备定制活动: // class NewModulePositionHandler package com.example.locator; import com.google.gwt.event.shared.EventHandler; public interface NewModulePositionHandle

我正在为我的课程申请瓦丁。 我必须在屏幕上绘制一些地图,所以我使用gwt图形库。 我还有一些servlet正在等待请求。 当一些特定的请求到来时,地图的视图应该改变。 它引导我准备定制活动:

// class NewModulePositionHandler
package com.example.locator;

import com.google.gwt.event.shared.EventHandler;

public interface NewModulePositionHandler extends EventHandler {
    void onNewModulePosition(NewModulePositionEvent event);
}
import com.google.gwt.event.shared.GwtEvent;

public class NewModulePositionEvent extends GwtEvent<NewModulePositionHandler> {
    private static final Type<NewModulePositionHandler> TYPE = new Type<NewModulePositionHandler>();
    private final String m_Color;

    public NewModulePositionEvent(String color) {
        m_Color = color;
    }

    public static Type<NewModulePositionHandler> getType() {
        return TYPE;
    }

    public String getColor() {
        return m_Color;
    }

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<NewModulePositionHandler> getAssociatedType() {
        // TODO Auto-generated method stub
        return TYPE;
    }

    @Override
    protected void dispatch(NewModulePositionHandler handler) {
        handler.onNewModulePosition(this);
    }

}
下面是我的自定义事件的实现:

// class NewModulePositionHandler
package com.example.locator;

import com.google.gwt.event.shared.EventHandler;

public interface NewModulePositionHandler extends EventHandler {
    void onNewModulePosition(NewModulePositionEvent event);
}
import com.google.gwt.event.shared.GwtEvent;

public class NewModulePositionEvent extends GwtEvent<NewModulePositionHandler> {
    private static final Type<NewModulePositionHandler> TYPE = new Type<NewModulePositionHandler>();
    private final String m_Color;

    public NewModulePositionEvent(String color) {
        m_Color = color;
    }

    public static Type<NewModulePositionHandler> getType() {
        return TYPE;
    }

    public String getColor() {
        return m_Color;
    }

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<NewModulePositionHandler> getAssociatedType() {
        // TODO Auto-generated method stub
        return TYPE;
    }

    @Override
    protected void dispatch(NewModulePositionHandler handler) {
        handler.onNewModulePosition(this);
    }

}
c.java

package com.example.locator.widgetset.client.mycomp;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.shared.ui.Connect;
import com.example.locator.MyComp;
import com.example.locator.NewModulePositionEvent;
import com.example.locator.NewModulePositionHandler;
import com.example.locator.widgetset.client.mycomp.MyCompWidget;
import com.example.locator.widgetset.client.mycomp.MyCompServerRpc;
import com.vaadin.client.communication.RpcProxy;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.vaadin.shared.MouseEventDetails;
import com.vaadin.client.MouseEventDetailsBuilder;
import com.example.locator.widgetset.client.mycomp.MyCompClientRpc;
import com.example.locator.widgetset.client.mycomp.MyCompState;
import com.vaadin.client.communication.StateChangeEvent;

@Connect(MyComp.class)
public class MyCompConnector extends AbstractComponentConnector {
MyCompServerRpc rpc = RpcProxy
        .create(MyCompServerRpc.class, this);

public MyCompConnector() {
    registerRpc(MyCompClientRpc.class, new MyCompClientRpc() {
        public void alert(String message) {
            // TODO Do something useful
            Window.alert(message);
        }
        public void changeColor(String color) {
            getWidget().InitMap(color);         
        }
    });

    // TODO ServerRpc usage example, do something useful instead
    getWidget().addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            final MouseEventDetails mouseDetails = MouseEventDetailsBuilder
                .buildMouseEventDetails(event.getNativeEvent(),
                            getWidget().getElement());
            rpc.clicked(mouseDetails);
        }
    });


    getWidget().addNewModulePositionHandler(new NewModulePositionHandler() {

        public void onNewModulePosition(NewModulePositionEvent event) {
            // TODO Auto-generated method stub
            rpc.newModulePosition(event.getColor());
        }

    });

}

@Override
protected Widget createWidget() {
    return GWT.create(MyCompWidget.class);
}

@Override
public MyCompWidget getWidget() {
    return (MyCompWidget) super.getWidget();
}

@Override
public MyCompState getState() {
    return (MyCompState) super.getState();
}

@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
    super.onStateChanged(stateChangeEvent);

    // TODO do something useful
    final String color = getState().color;
    getWidget().InitMap(color);
}

}
d mycopserverrpc.java

package com.example.locator.widgetset.client.mycomp;

import com.vaadin.shared.MouseEventDetails;
import com.vaadin.shared.communication.ServerRpc;

public interface MyCompServerRpc extends ServerRpc {

    // TODO example API
    public void clicked(MouseEventDetails mouseDetails);
    public void newModulePosition(String color);
}
e mycopstate.java

package com.example.locator.widgetset.client.mycomp;

public class MyCompState extends com.vaadin.shared.AbstractComponentState {

    // TODO example state
    public String color = "#000000";

}
最后是小部件的实现:

f mycopwidget.java

package com.example.locator.widgetset.client.mycomp;
import org.vaadin.gwtgraphics.client.DrawingArea;
import org.vaadin.gwtgraphics.client.Line;
import org.vaadin.gwtgraphics.client.shape.Circle;
import org.vaadin.gwtgraphics.client.shape.Rectangle;

import com.example.locator.HasNewModulePositionHandlers;
import com.example.locator.NewModulePositionEvent;
import com.example.locator.NewModulePositionHandler;
import com.google.gwt.dev.util.collect.HashMap;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.touch.client.Point;
import com.example.locator.Module;

// TODO extend any GWT Widget


public class MyCompWidget extends DrawingArea implements HasNewModulePositionHandlers {

    public static final String CLASSNAME = "mycomp";
    public static double m_AreaWidth = 64.355;
    public static double m_AreaHeight = 17.385;
    public static int m_PictureWidth;
    public static int m_PictureHeight;
    public static double m_AreaToMapRatio;
    public static double m_RouteWidth = 3.5;
    public static double m_MainRouteCoordinateY = 8.0828;
    public Circle circle;
    //public HashMap<Integer, Module> ModuleMap = new HashMap<Integer, Module>();

    public MyCompWidget(){
        super(640, 320);

        //ModuleMap.put(666, new Module(666, 30.0, 8.08, new Circle((int)TranslateCoordinate(30.0), (int)TranslateCoordinate(8.0), 7)));
        //ModuleMap.put(15, new Module(15, 27.0, 8.08, new Circle((int)TranslateCoordinate(30.0), (int)TranslateCoordinate(8.0), 7)));

        double xRatio = m_AreaWidth / 640;
        double yRatio = m_AreaHeight / 320;
        m_AreaToMapRatio = xRatio > yRatio ? xRatio : yRatio;

        InitMap("#919491");
        setStyleName(CLASSNAME);
    }

    public void InitMap(String color)
    {
        m_PictureWidth  = (int)TranslateCoordinate(m_AreaWidth);
        m_PictureHeight  = (int)TranslateCoordinate(m_AreaHeight);
        Rectangle rectangle = new Rectangle(0, 0, m_PictureWidth, m_PictureHeight);
        rectangle.setFillColor(color);
        add(rectangle);
        Point point1Beg = new Point(0.0, 8.0828);
        Point point1End = new Point(64.355, 8.0838);

        Point point2Beg = new Point(20.2825, 8.0828);
        Point point2End = new Point(20.2825, 17.385);

        Point point3Beg = new Point(59.325, 0.0);
        Point point3End = new Point(59.325, 8.0828);

        point1Beg = TranslatePoint(point1Beg);
        point1End = TranslatePoint(point1End);

        point2Beg = TranslatePoint(point2Beg);
        point2End = TranslatePoint(point2End);

        point3Beg = TranslatePoint(point3Beg);
        point3End = TranslatePoint(point3End);

        Line line1 = new Line((int)point1Beg.getX(), (int)point1Beg.getY(), (int)point1End.getX(), (int)point1End.getY());
        Line line2 = new Line((int)point2Beg.getX(), (int)point2Beg.getY(), (int)point2End.getX(), (int)point2End.getY());
        Line line3 = new Line((int)point3Beg.getX(), (int)point3Beg.getY(), (int)point3End.getX(), (int)point3End.getY());

        line1.setStrokeColor("#FFFFFF");
        line2.setStrokeColor("#FFFFFF");
        line3.setStrokeColor("#FFFFFF");

        line1.setStrokeWidth((int)TranslateCoordinate(m_RouteWidth));
        line2.setStrokeWidth((int)TranslateCoordinate(m_RouteWidth));
        line3.setStrokeWidth((int)TranslateCoordinate(m_RouteWidth));

        add(line1);
        add(line2);
        add(line3);

        DrawWall(TranslateCoordinate(10.0));
        DrawWall(TranslateCoordinate(20.0));
        DrawWall(TranslateCoordinate(30.0));
        DrawWall(TranslateCoordinate(40.0));
        DrawWall(TranslateCoordinate(50.0));
        DrawWall(TranslateCoordinate(60.0));

        DrawDoor(3.0, 3.0);
        DrawDoor(13.0, 3.0);
        DrawDoor(23.0, 3.0);
        DrawDoor(33.0, 3.0);
        DrawDoor(43.0, 3.0);
        DrawDoor(53.0, 3.0);
        circle = new Circle((int)TranslateCoordinate(25.0), (int)TranslateCoordinate(8.0), 15);
        add(circle);
    }

    public void DrawWall(double a_Place)
    {
        Line line = new Line((int)a_Place, 0, (int)a_Place, (int)TranslateCoordinate(m_AreaHeight));
        line.setStrokeColor("#FFFFFF");
        add(line);
    }

    public void DrawDoor(double a_Position, double a_Width)
    {
        double realDoorPositionY = m_MainRouteCoordinateY - (m_RouteWidth / 2);
        int doorPositionYTop = (int)TranslateCoordinate(realDoorPositionY) - 1;
        int doorPositionYBottom = (int)TranslateCoordinate(realDoorPositionY + m_RouteWidth) + 1;

        Line line = new Line((int)TranslateCoordinate(a_Position), doorPositionYTop, (int)TranslateCoordinate(a_Position) + (int)TranslateCoordinate(a_Width), doorPositionYTop);
        line.setStrokeColor("#000000");
        line.setStrokeWidth(2);
        add(line);
        Line line2 = new Line((int)TranslateCoordinate(a_Position), doorPositionYBottom, (int)TranslateCoordinate(a_Position) + (int)TranslateCoordinate(a_Width), doorPositionYBottom);
        line2.setStrokeColor("#000000");
        line2.setStrokeWidth(2);
        add(line2);
    }

    public Point TranslatePoint(Point a_Point)
    {
        Point translatedPoint = new Point(TranslateCoordinate(a_Point.getX()), TranslateCoordinate(a_Point.getY()));
        return translatedPoint;
    }

    public double TranslateCoordinate(double a_Coordinate)
    {
        return (a_Coordinate) / (m_AreaToMapRatio);
    }

    public void Move(int id) {
        //ModuleMap.get(id).GetCircle().setX(10 + circle.getX());
    }


       public HandlerRegistration addNewModulePositionHandler(
                NewModulePositionHandler handler) {
            return addHandler(handler, NewModulePositionEvent.TYPE);
        }

        private void someMethod() {
            fireEvent(new NewModulePositionEvent("#000000"));
        }
        public void emulateEvent() {
            someMethod();
        }
}
如果我编译包含MyCompWidget的小部件集,然后在glassfish上运行我的应用程序,我会得到以下消息:

Widgetset'com.example.locator.Widgetset.LocatorWidgetset'不包含com.example.locator.MyComp的实现。检查其组件连接器的@Connect映射、widgetsets GWT模块描述文件,然后重新编译widgetset。如果您下载了vaadin附加程序包,您可能需要参考附加程序说明

如果我切

小部件工作正常,当然我也必须从MyCompConnector中注释掉这些行:

    getWidget().addNewModulePositionHandler(new NewModulePositionHandler() {

        public void onNewModulePosition(NewModulePositionEvent event) {
            // TODO Auto-generated method stub
            rpc.newModulePosition(event.getColor());
        }

    });
谁能告诉我哪里出了问题?小部件的编译似乎失败了,但我找不到任何相关信息。 请帮帮我。
提前感谢。

编译问题非常清楚:GWT编译器无法为指定的java类提供源代码。分两步将源文件添加到GWT编译器作用域:

*.java文件必须可以通过类路径访问eclipse gwt编译器自动将所有源文件夹包含到类路径中 你需要告诉GWT它应该在编译过程中考虑你的包。 在父包中相对于源文件创建.gwt.xml文件,其中包含以下内容如果您的包是pkg1.pkg2.pkg3,那么您应该在pkg1.pkg2包中创建文件pkg3.gwt.xml,pkg=pkg3,按照惯例pkg3通常命名为client 3功能接口

public interface QuestionClickHandler extends EventHandler {
    public void onQuestionClicked(QuestionClickEvent event);
}
public interface HasQuestionClickHandlers {
    // Attention! method returns HandlerRegistration, so that handler can be cancelled
    public HandlerRegistration addQuestionClickHandler(
            QuestionClickHandler handler);
}
4您的小部件/组件

public class SummaryPanel extends Widget implements HasQuestionClickHandlers {
// blah-blah-blah

        // implement your handler registration method
    @Override
    public HandlerRegistration addQuestionClickHandler(
            QuestionClickHandler handler) {
        return addHandler(handler, QuestionClickEvent.TYPE);
    }

// blah-blah-blah

    private someMethod() {
        // suddenly you realized that you need to to fire your event
        fireEvent(new QuestionClickEvent(script, question));
    }

// sample external API method

    public void emulateEvent() {
        someMethod();
    }
}
最后是使用示例:

    SummaryPanel summary = new SummaryPanel();
    summary.addQuestionClickHandler(new QuestionClickHandler() {

        @Override
        public void onQuestionClicked(QuestionClickEvent event) {
            // your reaction goes here
        }
    });

谢谢你的回复。我已经将你的提示应用到我更新的代码中,但是这个小部件仍然不工作。它在没有我的事件的情况下成功编译。我理解错了什么吗?你需要更多的细节来解决我的问题吗?
public class QuestionClickEvent extends GwtEvent<QuestionClickHandler> {

    public QuestionClickEvent(SScript script, SQuestion question) {
        super();
        this.script = script;
        this.question = question;
    }

    public static final Type<QuestionClickHandler> TYPE = new Type<QuestionClickHandler>();

    // internal event state
    private final SScript script;
    private final SQuestion question;

    @Override
    public Type<QuestionClickHandler> getAssociatedType() {
         return TYPE;
    }

    @Override
    protected void dispatch(QuestionClickHandler handler) {
        handler.onQuestionClicked(this);
    }


    // provide access to internal event state

    public SScript getScript() {
        return script;
    }

    public SQuestion getQuestion() {
        return question;
    }
}
public interface QuestionClickHandler extends EventHandler {
    public void onQuestionClicked(QuestionClickEvent event);
}
public interface HasQuestionClickHandlers {
    // Attention! method returns HandlerRegistration, so that handler can be cancelled
    public HandlerRegistration addQuestionClickHandler(
            QuestionClickHandler handler);
}
public class SummaryPanel extends Widget implements HasQuestionClickHandlers {
// blah-blah-blah

        // implement your handler registration method
    @Override
    public HandlerRegistration addQuestionClickHandler(
            QuestionClickHandler handler) {
        return addHandler(handler, QuestionClickEvent.TYPE);
    }

// blah-blah-blah

    private someMethod() {
        // suddenly you realized that you need to to fire your event
        fireEvent(new QuestionClickEvent(script, question));
    }

// sample external API method

    public void emulateEvent() {
        someMethod();
    }
}
    SummaryPanel summary = new SummaryPanel();
    summary.addQuestionClickHandler(new QuestionClickHandler() {

        @Override
        public void onQuestionClicked(QuestionClickEvent event) {
            // your reaction goes here
        }
    });