GWT 原生拖放事件处理(两个来源,一个目标)

GWT native Drag&Drop Event-Handling (two sources, one target)

我正在尝试在我的项目中实现本机拖放功能。

我创建了两个 Image-Widgets 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 上创建一个新面板(对于每个拖动的图像另一个)。当我 运行 以下代码并拖动 image1image2 时,它们都会显示 ap1。我认为我的 if-else-conditions 没有正常工作:

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());   

我做错了什么?

感谢您的帮助。

来自您的 post 的代码片段:

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

原因:

是的,问题出在 if 条件上,image1 是一个小部件,您已经对其进行了初始化,它将始终具有一个值。

更多信息:

当我们拖动 image1 或 image2 时,事件被正确触发,并且在 onDrop 中我们检查 image1 小部件的值不为空,并且此条件始终为真,因此您一直在打印 ap1。

解法:

更正您的 if 条件,使条件检查对于 onDrop 方法中的 image1 和 image2 是唯一的。

方法一:

添加布尔变量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;
 }