2016-06-13 45 views
0

我試圖在我的項目中實現本機拖動&拖放功能。GWT本地拖放事件處理(兩個來源,一個目標)

我已經創建了兩個圖像的小部件image1image2

image1.getElement().setDraggable(Element.DRAGGABLE_TRUE); 
image2.getElement().setDraggable(Element.DRAGGABLE_TRUE); 

然後創建處理程序爲每一個:

image1.addDragStartHandler(new DragStartHandler() { 
     @Override 
     public void onDragStart(DragStartEvent event) { 
      event.setData("text", "images/img1.svg"); 
      }); 

image2.addDragStartHandler(new DragStartHandler() { 
     @Override 
     public void onDragStart(DragStartEvent event) { 
      event.setData("text", "images/img2.svg"); 
      }); 

這是DragOverHandler:

boundaryPanel.addDomHandler(new DragOverHandler() { 
        public void onDragOver(DragOverEvent event) { 
         boundaryPanel.getElement().getStyle().setBackgroundColor("#ffa"); 
        } 
       }, com.google.gwt.event.dom.client.DragOverEvent.getType()); 

然後我創建了DropHandler,它應該能夠決定哪個圖像被拖動。拖動時,應該爲boundaryPanel創建一個新面板(對於每個拖動的圖像)。當我運行下面的代碼並拖動image1image2ap1顯示爲他們兩個。我認爲我的if-else條件不能正常工作:

boundaryPanel.addDomHandler(new DropHandler() {    
     @Override 
     public void onDrop(DropEvent event) { 
     event.preventDefault(); 
     int x = (event.getNativeEvent().getClientX() - boundaryPanel.getAbsoluteLeft()); 
     int y = (event.getNativeEvent().getClientY() - boundaryPanel.getAbsoluteTop()); 
     boundaryPanel.getElement().getStyle().clearBackgroundColor(); 
     if(image1 != null){ <---think this is the problem 
      //insert absolutePanel ap1 
      ap1.add(ap2); 
      ap1.add(ap3); 
      ap1.add(ap4);   
      ap1.setWidgetPosition(ap3, 150, 0); 
      ap1.setWidgetPosition(ap4, 474, 0);    
      boundaryPanel.add(ap1, x, y); 
      } 
      else if (img2 != null) { 
      //insert absolutePanel ap5 
      ap5.add(ap6); 
      ap5.add(ap7); 
      ap5.add(ap8);   
      ap5.setWidgetPosition(ap7, 150, 0); 
      ap5.setWidgetPosition(ap8, 474, 0);    
      boundaryPanel.add(ap5, x, y);     
        } 
       }}, DropEvent.getType()); 

我在做什麼錯了?

感謝您的幫助。

回答

0

代碼段從您的帖子:

........ 
    boundaryPanel.getElement().getStyle().clearBackgroundColor(); 
    if(image1 != null){ <---think this is the problem 
     //insert absolutePanel ap1 
    ...... 

原因:

是,問題是如果條件,此搜索是一個小部件,你已經初始化,它總是有一個值。

更多信息:

當我們拖動圖像1或圖像2,活動正常發射,並在此搜索widget的onDrop我們正在檢查該值不爲空,這種情況總是如此,因此你一直在打印ap1。

解決方案:

糾正你,如果條件使得條件檢查是唯一的圖像1和圖像2中onDrop方法。

方法1:

添加布爾變量isImage1Dragged和isImage2Dragged並有默認值設置爲false。 在IMAGE1的拖動部分,設置isImage1Dragged爲true,並在onDrop方法變量修改該條件如下

if(isImage1Dragged) { 

    // Do whatever you want when image1 is dragged 
    ...... 
    ...... 
    isImage1Dragged = false; 

} else if(isImage2Dragged) { 
     // Do whatever you want when image2 is dragged 
    ...... 
    ...... 
    isImage2Dragged = false; 
} 
+0

感謝您的背景!你能幫助我正確的條件嗎?我不知道如何使它獨一無二。 – Jogi

+0

有沒有辦法說:如果image1或image2被拖拽,做些什麼? – Jogi

+0

我在答案中加入了一個方法,希望它能幫助 –