2013-07-18 5 views
0

Итак, я реализовал очень простой виджет загрузки файлов с перетаскиванием. В основном мой виджет представляет собой вертикальную панель с несколькими ярлыками и кнопкой внутри. Пользователь может перетащить файл в вертикальную панель или нажать кнопку и просмотреть файл.Загрузка файла перетаскивания GWT не работает

Проблема в том, что когда я перетаскиваю файл на вертикальную панель, он запускает DragLeaveEvent каждый раз, когда я перетаскиваю элемент по пространству, которое занимают метки или кнопки. Я хочу, чтобы он знал, что элемент находится на вертикальной панели, даже если он находится поверх метки или кнопки. Я уверен, что мне не хватает чего-то простого. Я обеспечить функциональность перетаскивания путем добавления этих обработчиков Dóm к вертикальной панели:

addDomHandler(new DragEnterHandler() { 
      @Override 
      public void onDragEnter(DragEnterEvent event) { 
       System.out.println("drag enter"); 
       highlight(true); 
      } 
     }, DragEnterEvent.getType()); 

addDomHandler(new DragLeaveHandler() { 
      @Override 
      public void onDragLeave(DragLeaveEvent event) { 
       System.out.println("drag leave"); 
       highlight(false); 
      } 
     }, DragLeaveEvent.getType()); 

addDomHandler(new DragOverHandler() { 
      @Override 
      public void onDragOver(DragOverEvent event) { 
      } 
     }, DragOverEvent.getType()); 

addDomHandler(new DropHandler() { 
      @Override 
      public void onDrop(DropEvent event) { 
       System.out.println("drop"); 
       // stop default behaviour 
       event.preventDefault(); 
       event.stopPropagation(); 

       // starts the fetching, reading and callbacks 
       if (fileUploadHandler != null) { 
        handleFiles(event.getDataTransfer(), fileUploadHandler); 
       } 
       highlight(false); 
      } 
     }, DropEvent.getType());  

ответ

0

Через много исследований я пришел к единственному решению я смог найти. Я устанавливаю подсветку в true в обработчике dragover вместо drag enter.

panel.addDomHandler(new DragEnterHandler() { 
     @Override 
     public void onDragEnter(DragEnterEvent event) { 
     } 
    }, DragEnterEvent.getType()); 

    panel.addDomHandler(new DragLeaveHandler() { 
     @Override 
     public void onDragLeave(DragLeaveEvent event) { 
      highlight(false); 
     } 
    }, DragLeaveEvent.getType()); 

    panel.addDomHandler(new DragOverHandler() { 
     @Override 
     public void onDragOver(DragOverEvent event) { 
      highlight(true); 
     } 
    }, DragOverEvent.getType()); 

    panel.addDomHandler(new DropHandler() { 
     @Override 
     public void onDrop(DropEvent event) { 
      // stop default behaviour 
      event.preventDefault(); 
      event.stopPropagation(); 

      // starts the fetching, reading and callbacks 
      handleFiles(event.getDataTransfer()); 
      highlight(false); 
     } 
    }, DropEvent.getType()); 
0

Убедитесь, что целевое событие является потомком (или великого ребенка) на панели, или в данном случае, может быть, скорее ли целевое событие в точности вашей панели элемент:

if (verticalPanel.getElement().isOrHasChild(Node.as(event.getNativeEvent().getEventTarget()))) { 
    // within the panel (possibly on a child) 
} 

if (verticalPanel.getElement() == Node.as(event.getNativeEvent().getEventTarget())) { 
    // targetting exactly the panel (e.g. leaving the panel, not one of its children) 
} 
+0

Я вижу, как это показывает мне, какие элементы являются дети, но то, что я хочу сделать это перетащить файл в любом месте в вертикальной панели и быть в состоянии бросить его, но я не в состоянии сделать это, потому что обработчики перетаскивания рассмотрите ярлыки и прочее не в панели. Я хочу, чтобы файл рассматривался внутри вертикальной панели независимо от того, пересекается ли он над меткой или кнопкой – Will

+0

. Я полагаю, что вы получаете 'DragEnter',' DragOver' и 'DragLeave' для каждого дочернего элемента (из-за пузырьков событий) , поэтому вы хотите обрабатывать только те события, которые непосредственно нацелены на панель; т. е. игнорировать события, которые нацелены на ваш ярлык и кнопку. –

+0

Да, но проблема остается в том, что она отправляет событие перетаскивания, когда я все еще нахожусь внутри панели, но перехожу на ярлык, потому что он думает, что он покидает панель и входит в ярлык, даже думал, что ярлык находится внутри панели. – Will

Смежные вопросы