2011-02-16 75 views
0

我试图在小部件之间进行直接连接的连接。但是当我这样做时,连接器的方向会出错。它总是平行于所需的方向。 ,它是独立的,当我提出我的插件的连接部件,即,我的连接器不我的代码move.Snippet给出如下​​: 链接到问题的快照:http://goo.gl/JUEmJGWT连接器在直连式连接中的问题

公共类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{ 

      } 
    } 
} 

}

回答

0

我知道这是相当古老的,但我有与gwt连接器库类似的问题。

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

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