2011-02-16 2 views
0

위젯간에 직선 연결을 만들려고합니다.하지만 그렇게 할 때 커넥터의 방향이 잘못되었습니다. 항상 필요한 것과 평행하게됩니다. 또한 http://goo.gl/JUEmJ직선 연결의 GWT 커넥터에 문제가 있음

공용 클래스 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{ 

      } 
    } 
} 
: 문제의 스냅 샷 링크 : 내 위젯을 이동할 때 연결 위젯 즉, 그것은 독립적이다, 내 커넥터는 내 코드의하지 move.Snippet는 다음과 같이 주어진다 않습니다

}

답변

0

나는 이것이 꽤 오래된 것을 알고 있지만 gwt- 커넥터 라이브러리와 비슷한 문제를 겪고있었습니다.

표준 모드을 사용하는 경우 커넥터가 올바른 위치에 나타나지 않습니다. 단점 모드을 대신 사용하십시오.

또한 드래그하는 동안 dnd 구성 요소를 끌 때 (연결 수신기에서) connector.update()를 수동으로 수행해야 연결이 끝점과 함께 이동합니다.

관련 문제