Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8346932

Drag-n-drop gesture blocks subsequent mouse events

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • jfx25
    • jfx20, jfx17, jfx22, jfx24
    • javafx

      A drag-n-drop gesture containing a selection will block subsequent mouse events in (for instance) a modal dialog launched after completion of the gesture. Easily verified using a slightly modified version of Oracle sample code https://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.html, attached in this report.
      To be noted: if the added Alert dialog is initialized with Modality.NONE or Modality.WINDOW_MODAL, the issue is not reproduced.

      Reproducing the Issue
      Steps to Reproduce
      1. Launch sample code as attached.
      2. Perform drag-n-drop gesture.
      3. Close window to trigger close event, which launches modal Alert.
      4. Attempt interaction with Alert.
      Expected Result
      Alert should handle mouse events.
      Actual Result
      Alert seems to not receive mouse events. Keyboard input works.
      Source code for an executable test case
      package hellodraganddrop;
      import javafx.application.Application;
      import javafx.event.EventHandler;
      import javafx.scene.Group;
      import javafx.scene.Scene;
      import javafx.scene.input.*;
      import javafx.scene.paint.Color;
      import javafx.scene.text.Text;
      import javafx.stage.Stage;
      /**
      • Demonstrates a drag-and-drop feature.
      */
      public class HelloDragAndDrop extends Application {
      @OverRide public void start(Stage stage) {
      stage.setTitle("Hello Drag And Drop");
       Group root = new Group();
       Scene scene = new Scene(root, 400, 200);
       scene.setFill(Color.LIGHTGREEN);

       final Text source = new Text(50, 100, "DRAG ME");
       source.setScaleX(2.0);
       source.setScaleY(2.0);

       final Text target = new Text(250, 100, "DROP HERE");
       target.setScaleX(2.0);
       target.setScaleY(2.0);

       source.setOnDragDetected(new EventHandler <MouseEvent>() {
           public void handle(MouseEvent event) {
               /* drag was detected, start drag-and-drop gesture*/
               System.out.println("onDragDetected");
               
               /* allow any transfer mode */
               Dragboard db = source.startDragAndDrop(TransferMode.ANY);
               
               /* put a string on dragboard */
               ClipboardContent content = new ClipboardContent();
               content.putString(source.getText());
               db.setContent(content);
               
               event.consume();
           }
       });

       target.setOnDragOver(new EventHandler <DragEvent>() {
           public void handle(DragEvent event) {
               /* data is dragged over the target */
               System.out.println("onDragOver");
               
               /* accept it only if it is not dragged from the same node
                * and if it has a string data */
               if (event.getGestureSource() != target &&
                       event.getDragboard().hasString()) {
                   /* allow for both copying and moving, whatever user chooses */
                   event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
               }
               
               event.consume();
           }
       });

       target.setOnDragEntered(new EventHandler <DragEvent>() {
           public void handle(DragEvent event) {
               /* the drag-and-drop gesture entered the target */
               System.out.println("onDragEntered");
               /* show to the user that it is an actual gesture target */
               if (event.getGestureSource() != target &&
                       event.getDragboard().hasString()) {
                   target.setFill(Color.GREEN);
               }
               
               event.consume();
           }
       });

       target.setOnDragExited(new EventHandler <DragEvent>() {
           public void handle(DragEvent event) {
               /* mouse moved away, remove the graphical cues */
               target.setFill(Color.BLACK);
               
               event.consume();
           }
       });
       
       target.setOnDragDropped(new EventHandler <DragEvent>() {
           public void handle(DragEvent event) {
               /* data dropped */
               System.out.println("onDragDropped");
               /* if there is a string data on dragboard, read it and use it */
               Dragboard db = event.getDragboard();
               boolean success = false;
               if (db.hasString()) {
                   target.setText(db.getString());
                   success = true;
               }
               /* let the source know whether the string was successfully
                * transferred and used */
               event.setDropCompleted(success);
               
               event.consume();
           }
       });

       source.setOnDragDone(new EventHandler <DragEvent>() {
           public void handle(DragEvent event) {
               /* the drag-and-drop gesture ended */
               System.out.println("onDragDone");
               /* if the data was successfully moved, clear it */
               if (event.getTransferMode() == TransferMode.MOVE) {
                   source.setText("");
               }
               
               event.consume();
           }
       });

       root.getChildren().add(source);
       root.getChildren().add(target);
       stage.setScene(scene);

      // Addition to demonstrate issue
      stage.setOnCloseRequest(e -> new Alert(Alert.AlertType.CONFIRMATION).showAndWait());
       stage.show();
      }
      public static void main(String[] args) {
      Application.launch(args);
      }
      }
      Workaround
      Use keyboard, e.g. ESC to dismiss Alert.

            arapte Ambarish Rapte
            pardesha Pardeep Sharma
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: