2016-11-17 3 views
2

У меня есть узел, который я хочу реализовать для перетаскивания (этот объект является источником не целевой). Я также хочу, чтобы объект двигался вместе с курсором мыши. Мне удалось сделать это, но не в одно и то же время.Как выполнить код во время операции перетаскивания?

Похоже, что setOnDragDetected и setOnMouseDragged не работают вместе. Рассмотрим узел со следующими обработчиками:

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class Example extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     Rectangle rect = new Rectangle(20, 20); 
     rect.setOnMousePressed(e -> System.out.println("Pressed")); 
     rect.setOnMouseDragged(e -> System.out.println("Dragged")); 
     rect.setOnDragDetected(e -> { 
      System.out.println("Detected"); 
      ClipboardContent content = new ClipboardContent(); 
      content.putString("something"); 
      Dragboard db = rect.startDragAndDrop(TransferMode.ANY); 
      db.setContent(content); 
     }); 
     Group subGroup = new Group(rect); 

     Scene scene = new Scene(subGroup, 100, 100); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 

     Example.launch(args); 
    } 
} 

Теперь нажмите мышь на узел и переместите мышь. Это выход:

Pressed 
Dragged 
Dragged 
Dragged 
Dragged 
Dragged 
Dragged 
Detected 

После того, как сопротивление будет обнаружен MouseDragged проводник останавливается.

Как достичь того, что я описал? Одна вещь, которую я заметил, может быть, это то, что я могу использовать onDragOver для родителя, но я хочу, чтобы поведение было в узле, потому что именно там оно и должно быть.

+0

Я вообще этого не наблюдаю; обработчик 'onMouseDragged' продолжает сообщать, когда обнаружен жест перетаскивания. Вы должны создать [MCVE] и [изменить] свой вопрос, чтобы включить его. –

+0

@James_D извините. вот код. Я думаю, что это связано с перетаскиванием. – Mark

ответ

0

Вы смешиваете здесь две вещи. Короче говоря, когда вы вызываете метод startDragAndDrop, система переключается на режим перетаскивания, и Java перестает доставлять MouseEvent в rect.

MouseEvent documentation имеет раздел «Перетаскивание жестов», который объясняет три типа жестов перетаскивания. Вот лишь краткое резюме:

  • простого пресс-перетаскивание-релиз - когда сопротивление детектируется Java продолжает поставлять MouseEvents в узел, где было обнаружено сопротивление.
  • полный пресс-перетаскивание - вы можете позвонить startFullDrag внутри обработчика, который вы установили с помощью setOnDragDetected. Затем Java также начинает доставлять MouseDragEvents другим узлам (потенциальным целям жестов).
  • поддерживаемый платформой drag-and-drop - если вы вызываете startDragAndDrop внутри обработчика OnDragDetected, Java прекратит доставлять MouseEvents и начнет доставлять DragEvents. Это используется для взаимодействия с другими приложениями.

Непонятно, чего вы хотите достичь, но пока вы не хотите перетаскивать что-то за пределы вашего приложения, попробуйте вместо этого использовать startFullDrag.

Также может быть полезно ознакомиться с документацией DragEvent и MouseDragEvent.

+0

Мне нужны только события в моем приложении. Если я использую 'startFullDrag', целевые узлы не реагируют на' OnDragEntered' и выходят. Что-то нужно проверить, что происходит операция перетаскивания, входить/покидать свое пространство и реагировать в соответствии с содержимым - если оно действительно или нет. это я могу сделать только с 'startDragAndDrop'. – Mark

+0

@Mark, если вы используете 'startFullDrag', вам нужно установить обработчик' OnMouseDragEntered' на цель вместо 'OnDragEntered'. – FelixRabe

+0

Да, но функциональность обработчиков перетаскивания мыши отличается от функциональных обработчиков D & D. например: «OnDragDone» позволяет делать вещи в источнике в конце перетаскивания, но для него нет эквивалента «onMouseDragDone».Также указатель мыши не изменяется, чтобы указать, действительна ли цель капли или нет, как с D & D. – Mark

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