直端连接中的GWT接头有问题

直端连接中的GWT接头有问题,gwt,drag-and-drop,gxt,connector,Gwt,Drag And Drop,Gxt,Connector,我试图在小部件之间建立直端连接。但当我这样做时,我的连接器的方向出现错误。它总是与所需的方向平行。此外,它独立于连接的小部件,即当我移动小部件时,我的连接器不会移动。我的代码片段如下所示: 指向问题快照的链接: 公共类DragNDropPage{ SyncCurrentUser cu = SyncCurrentUser.getUser(); private AbsolutePanel area = new AbsolutePanel(); HorizontalPanel toolsPanel =

我试图在小部件之间建立直端连接。但当我这样做时,我的连接器的方向出现错误。它总是与所需的方向平行。此外,它独立于连接的小部件,即当我移动小部件时,我的连接器不会移动。我的代码片段如下所示: 指向问题快照的链接:

公共类DragNDropPage{

SyncCurrentUser cu = SyncCurrentUser.getUser();
private AbsolutePanel area = new AbsolutePanel();
HorizontalPanel toolsPanel = new HorizontalPanel();
AbsolutePanel canvas = new AbsolutePanel();
DragController toolboxDragController;
Label startLabel = new Label("START");
Label stopLabel = new Label("STOP");
Label activityLabel = new Label("ACTIVITY");
Label processLabel = new Label("PROCESS");
Button stopDrag = new Button("Done Dragging");
Button saveButton = new Button("Save");
PickupDragController dragController = new PickupDragController(area, true);
AbsolutePositionDropController dropController = new AbsolutePositionDropController(area);
private List<Widget> selected = new ArrayList<Widget>();
private List<Widget> onCanvas = new ArrayList<Widget>();
private List<Connection> connections = new ArrayList<Connection>();
private CActivity[] aItems;
private CProcess[] pItems;
MyHandler handler = new MyHandler();
int mouseX,mouseY;


String style;

public DragNDropPage() {
    toolboxDragController = new ToolboxDragController(dropController, dragController);
    RootPanel.get("rightbar").add(area);
    area.setSize("575px", "461px");


    area.add(toolsPanel);
    toolsPanel.setSize("575px", "37px");

    toolsPanel.add(startLabel);
    startLabel.setSize("76px", "37px");
    toolboxDragController.makeDraggable(startLabel);

    toolsPanel.add(stopLabel);
    stopLabel.setSize("66px", "37px");
    toolboxDragController.makeDraggable(stopLabel);

    toolsPanel.add(activityLabel);
    activityLabel.setSize("82px", "36px");
    toolboxDragController.makeDraggable(activityLabel);

    toolsPanel.add(processLabel);
    processLabel.setSize("85px", "36px");
    toolboxDragController.makeDraggable(processLabel);

    stopDrag.addClickHandler(handler);
    toolsPanel.add(stopDrag);
    stopDrag.setWidth("114px");

    saveButton.addClickHandler(handler);
    toolsPanel.add(saveButton);

    area.add(canvas, 0, 36);
    canvas.setSize("575px", "425px");

    Event.addNativePreviewHandler(new Event.NativePreviewHandler() {    
    @Override
    public void onPreviewNativeEvent(NativePreviewEvent event) {
        //46 is the key code for Delete Button
        if(event.getNativeEvent().getKeyCode() == 46 && !selected.isEmpty()) {
                for (Iterator<Widget> i = selected.listIterator(); i.hasNext();) {
                    Widget w = (Widget) i.next();
                    UIObjectConnector.unwrap(w);
                    i.remove();
                    w.removeFromParent();
                    onCanvas.remove(i);
                }
            }
        }
    });

aItems = cu.currentUser.getcActivity();
pItems = cu.currentUser.getcProcess();
}

private class ToolboxDragController extends PickupDragController {

    public ToolboxDragController(final DropController dropController, final DragController nodesDragController) {
        super(area ,false);
        setBehaviorDragProxy(true);
        registerDropController(dropController);

        addDragHandler(new DragHandlerAdapter(){

            public void onPreviewDragEnd(DragEndEvent event) throws VetoDragException {

                Widget node = (Widget) event.getSource();
                int left = event.getContext().desiredDraggableX;
                int top = event.getContext().desiredDraggableY;
                AbsolutePanel panel = (AbsolutePanel) dropController.getDropTarget();

                createConnector((Label) node, panel, left, top);
                throw new VetoDragException();
            }

        });

    }
}

protected UIObjectConnector createConnector(Label proxy, AbsolutePanel panel, int left, int top) {
    Widget w;
    String str = proxy.getText();
    if(str.equals("START") || str.equals("STOP")){
        w = new Label(proxy.getText()){
            public void onBrowserEvent(Event event) {
                if( DOM.eventGetType(event) == 4 
                    && DOM.eventGetCtrlKey(event)){
                    select(this);
                }
                super.onBrowserEvent(event);
            }
        };
        w.getElement().setClassName("dnd-start-stop");
    }
    else{
        w = new ListBox(){
            public void onBrowserEvent(Event event) {
                if( DOM.eventGetType(event) == 4 
                    && DOM.eventGetCtrlKey(event)){
                    select(this);
                }
                super.onBrowserEvent(event);
            }
        };
        if(str.equals("ACTIVITY")){
            getAItems((ListBox)w);
            //w.getElement().addClassName("dnd-activity");
        }
        else if(str.equals("PROCESS")){
            getPItems((ListBox)w);
            //w.getElement().addClassName("dnd-process");
        }
    }
    onCanvas.add(w);
    left -= panel.getAbsoluteLeft();
    top -= panel.getAbsoluteTop();
    //panel.add(w,10,10);
    panel.add(w, left, top);
    dragController.makeDraggable(w);
    return UIObjectConnector.wrap(w);

}

private void getAItems(ListBox w) {
    for(int i=0;i<aItems.length;i++)
        w.addItem(aItems[i].getActivityName());
}

private void getPItems(ListBox w) {
    /*for(int i=0;i<pItems.length;i++)
        w.addItem(pItems[i].getProcessName());*/
    w.addItem("Process1");
}

protected void select(Widget w){
    if(selected.isEmpty()) {
        selected.add(w);
        w.getElement().addClassName("color-green");
    } else if(selected.contains(w)){
        selected.remove(w);
        w.getElement().removeClassName("color-green");
    } else if(selected.size() == 1) {
        Widget w2 = (Widget) selected.get(0);
        connect(UIObjectConnector.getWrapper(w2), UIObjectConnector.getWrapper(w));
        selected.clear();
    }
}

protected void connect(Connector a, Connector b) {
    //System.out.println(a.getLeft());
    //System.out.println(b.getLeft());
    add(new StraightTwoEndedConnection(a,b));
}


private void add(StraightTwoEndedConnection c) {
    canvas.add(c);
    connections.add(c);
    c.update();
}

protected void remove(Connection c) {
    connections.remove(c);
}

class MyHandler implements ClickHandler{

    @Override
    public void onClick(ClickEvent event) {
        Button name = (Button) event.getSource();
        if(name.equals(stopDrag)){
            if(name.getText().equals("Done Dragging")){
                for(Iterator<Widget> i = onCanvas.listIterator();i.hasNext();){
                    Widget w = (Widget) i.next();
                    dragController.makeNotDraggable(w);
                    }
                name.setText("Continue");
                }
            else {
                for(Iterator<Widget> i = onCanvas.listIterator();i.hasNext();){
                    Widget w = (Widget) i.next();
                    dragController.makeDraggable(w);
                    }
                name.setText("Done Dragging");
                }
            }
        else{

            }
    }
}
SyncCurrentUser cu=SyncCurrentUser.getUser();
专用AbsolutePanel区域=新AbsolutePanel();
水平面板工具面板=新水平面板();
AbsolutePanel画布=新建AbsolutePanel();
拖拉控制器工具箱拖拉控制器;
标签标签=新标签(“开始”);
标签停止标签=新标签(“停止”);
标签活动标签=新标签(“活动”);
标签流程标签=新标签(“流程”);
按钮停止拖动=新按钮(“完成拖动”);
按钮保存按钮=新按钮(“保存”);
PickupDragController dragController=新的PickupDragController(区域,真);
AbsolutePositionDropController dropController=新的AbsolutePositionDropController(区域);
所选私有列表=新建ArrayList();
private List onCanvas=new ArrayList();
私有列表连接=新建ArrayList();
私人活动[]aItems;
私有过程[]陷阱;
MyHandler=新的MyHandler();
int mouseX,mouseY;
弦乐风格;
公共DragNDropPage(){
toolboxDragController=新toolboxDragController(dropController,dragController);
RootPanel.get(“rightbar”).add(区域);
面积设置尺寸(“575px”、“461px”);
面积。添加(工具板);
工具板设置尺寸(“575px”、“37px”);
toolsPanel.add(标签);
设置大小(“76px”、“37px”);
toolboxDragController.MakedDragable(StartAbel);
工具面板。添加(停止标签);
stopLabel.setSize(“66px”、“37px”);
toolboxDragController.makeDragable(停止标签);
toolsPanel.add(活动标签);
activityLabel.setSize(“82px”、“36px”);
toolboxDragController.makeDraggable(活动标签);
toolsPanel.add(过程标签);
processLabel.setSize(“85px”、“36px”);
toolboxDragController.makeDragable(processLabel);
stopDrag.addClickHandler(handler);
toolsPanel.add(停止拖动);
停止阻力。设定宽度(“114px”);
saveButton.addClickHandler(处理程序);
toolsPanel.add(保存按钮);
添加(画布,0,36);
画布设置大小(“575px”、“425px”);
Event.addNativePreviewHandler(新事件.NativePreviewHandler(){
@凌驾
PreviewActiveEvent上的公共无效(NativePreviewEvent事件){
//46是删除按钮的关键代码
如果(event.getNativeEvent().getKeyCode()==46&&!selected.isEmpty()){
for(迭代器i=selected.listIterator();i.hasNext();){
Widget w=(Widget)i.next();
UIObjectConnector.展开(w);
i、 删除();
w、 removeFromParent();
onCanvas.remove(i);
}
}
}
});
aItems=cu.currentUser.getcActivity();
pItems=cu.currentUser.getcProcess();
}
私有类ToolboxDragController扩展PickupDragController{
公共工具箱DragController(最终DropController DropController,最终DragController节点DragController){
超级(面积,假);
setBehaviorDragProxy(真);
registerDropController(dropController);
addDragHandler(新DragHandlerAdapter(){
public void onPreviewDragEnd(DragEndEvent事件)引发VetoDragException{
Widget节点=(Widget)event.getSource();
int left=event.getContext().desiredDraggableX;
int top=event.getContext().desiredDraggableY;
AbsolutePanel=(AbsolutePanel)dropController.getDropTarget();
createConnector((标签)节点,面板,左侧,顶部);
抛出新的VetoDragException();
}
});
}
}
受保护的UIObjectConnector createConnector(标签代理、绝对面板面板、int-left、int-top){
小部件w;
String str=proxy.getText();
如果(str.equals(“开始”)| | str.equals(“停止”)){
w=新标签(proxy.getText()){
公共无效onBrowserEvent(事件){
if(DOM.eventGetType(event)==4
&&DOM.eventGetCtrlKey(事件)){
选择(这个);
}
超级浏览器事件(事件);
}
};
w、 getElement().setClassName(“dnd开始-停止”);
}
否则{
w=新列表框(){
公共无效onBrowserEvent(事件){
if(DOM.eventGetType(event)==4
&&DOM.eventGetCtrlKey(事件)){
选择(这个);
}
超级浏览器事件(事件);
}
};
如果(str.equals(“活动”)){
getAItems((列表框)w);
//w、 getElement().addClassName(“dnd活动”);
}
else if(str.equals(“过程”)){
getPItems((列表框)w);
//w、 getElement().addClassName(“dnd进程”);
}
}
onCanvas.add(w);
left-=panel.getAbsoluteLeft();
top-=panel.getAbsoluteTop();
//面板。添加(w,10,10);
面板。添加(w,左侧,顶部);
拖动控制器。使可拖动(w);
返回UIObjectConnector.wrap(w);
}
私有void getAItems(列表框w){

对于(inti=0;i我知道这已经很老了,但是我在gwt连接器库中遇到了类似的问题

如果使用的是标准模式,则连接器不会显示在正确的位置。请改用怪癖模式

此外,在拖动dnd组件(在拖动侦听器中)时,需要手动执行connector.update(),以便在拖动时连接随端点一起移动