2011-09-11 14 views
13

Mam niestandardowy widget, który jest w rzeczywistości obraz, i chciałbym móc przeciągnąć go wewnątrz AbsolutePanel i uzyskać jego współrzędne za każdym razem. Chciałbym użyć nowego DND API z GWT 2.4, ale mam trudności z jego implementacją. Czy ktoś może zaproponować podstawowe kroki, które muszę podjąć?Przeciągnij i upuść w GWT 2.4

+0

mogę widzisz, że dostajesz masywne punkty w tej sprawie ... Ładnie zrobione! :-) –

+0

czy wypróbowałeś smartgwt? – caarlos0

+0

no smartgwt, zacząłem używać go raz i nie, dziękuję :) Korzystam z tej strony przez długi czas, ale prawdę mówiąc nie znalazłem jeszcze czasu ani szybkości sprawdzenia, co oznaczają te punkty i gwiazdy ... –

Odpowiedz

12

Nowe API DnD wprowadzone za pomocą GWT 2.4 obecnie nie obsługuje AbsolutePanel (zobacz implementacje interfejsu HasAllDragAndDropHandlers). Patrząc na implementację FocusPanel nie powinno być zbyt trudno włączyć go dla innych paneli.

Oto krótki dowód pojęcia o tym, jak rozwiązać problem:

public void onModuleLoad() { 
    DragImage image = new DragImage(); 
    image.setUrl(Resources.INSTANCE.someImage().getSafeUri()); 
    final DropAbsolutePanel target = new DropAbsolutePanel(); 
    target.getElement().getStyle().setBorderWidth(1.0, Unit.PX); 
    target.getElement().getStyle().setBorderStyle(BorderStyle.SOLID); 
    target.getElement().getStyle().setBorderColor("black"); 
    target.setSize("200px", "200px"); 

    // show drag over effect 
    target.addDragOverHandler(new DragOverHandler() { 

     @Override 
     public void onDragOver(DragOverEvent event) { 
      target.getElement().getStyle().setBackgroundColor("#ffa"); 
     } 
    }); 

    // clear drag over effect 
    target.addDragLeaveHandler(new DragLeaveHandler() { 

     @Override 
     public void onDragLeave(DragLeaveEvent event) { 
      target.getElement().getStyle().clearBackgroundColor(); 
     } 
    }); 

    // enable as drop target 
    target.addDropHandler(new DropHandler() { 

     @Override 
     public void onDrop(DropEvent event) { 
      event.preventDefault(); 
      // not sure if the calculation is right, didn't test it really 
      int x = (event.getNativeEvent().getClientX() - target.getAbsoluteLeft()) + Window.getScrollLeft(); 
      int y = (event.getNativeEvent().getClientY() - target.getAbsoluteTop()) + Window.getScrollTop(); 
      target.getElement().getStyle().clearBackgroundColor(); 
      Window.alert("x: " + x + ", y:" + y); 
      // add image with same URL as the dropped one to absolute panel at given coordinates 
      target.add(new Image(event.getData("text")), x, y); 
     } 
    }); 

    RootPanel.get().add(image); 
    RootPanel.get().add(target); 
} 

I tu panel zwyczaj

public class DropAbsolutePanel extends AbsolutePanel implements HasDropHandlers, HasDragOverHandlers, 
     HasDragLeaveHandlers { 

    @Override 
    public HandlerRegistration addDropHandler(DropHandler handler) { 
     return addBitlessDomHandler(handler, DropEvent.getType()); 
    } 

    @Override 
    public HandlerRegistration addDragOverHandler(DragOverHandler handler) { 
     return addBitlessDomHandler(handler, DragOverEvent.getType()); 
    } 

    @Override 
    public HandlerRegistration addDragLeaveHandler(DragLeaveHandler handler) { 
     return addBitlessDomHandler(handler, DragLeaveEvent.getType()); 
    } 
} 

i klasa zdjęcie:

public class DragImage extends Image { 

    public DragImage() { 
     super(); 
     initDnD(); 
    } 

    private void initDnD() { 
     // enables dragging if browser supports html5 
     getElement().setDraggable(Element.DRAGGABLE_TRUE); 
     addDragStartHandler(new DragStartHandler() { 

      @Override 
      public void onDragStart(DragStartEvent event) { 
       // attach image URL to drag data 
       event.setData("text", getUrl()); 
      } 
     }); 
    } 
}