【问题标题】:Cancel drag action JavaFX取消拖动动作 JavaFX
【发布时间】:2017-03-06 13:05:34
【问题描述】:

在我的 JavaFX 应用程序中,我支持从操作系统拖放到我的应用程序,或者从应用程序内部。以下行为是我想要完成的:

  • 如果用户从我的应用程序内部开始拖动并用鼠标离开我的主窗口(离开我的应用程序),我想取消拖动操作,所以即使他用光标回来,他也不会触发任何拖拽事件(例如)。

我相信我必须在主窗口上的 dragExitted 上触发某种事件。有什么方法可以实现吗?

【问题讨论】:

  • 也许,如果拖动退出应用程序消费事件的边界?
  • 即使我消费了这个事件,我也只是消费了dragExitted事件......它不会取消拖动动作。当它回来时,仍然会触发“dragEntered”、“dragOver”和“dragDropped”
  • 只是猜测:鼠标退出时清除拖动板?
  • 是的,试过了,但它仍然会触发上述事件,如果松开鼠标,它不会掉落任何东西。在视觉上,用户仍然可以看到他正在拖动某些东西。

标签: events javafx drag-and-drop


【解决方案1】:

这是你可以玩的东西。我认为它可以满足您的需求。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.input.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.scene.text.*;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class ConsumeDragEvent extends Application
{

    @Override
    public void start(Stage primaryStage)
    {

        final Text source = new Text(50, 100, "DRAG ME");
        final Text target = new Text(300, 100, "DROP HERE");

        final boolean[] hasBeenOffScreen = {false};




        source.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                /* drag was detected, start a drag-and-drop gesture*/
                /* allow any transfer mode */
                hasBeenOffScreen[0] = false;
                Dragboard db = source.startDragAndDrop(TransferMode.ANY);

                ((Node) event.getSource()).setCursor(Cursor.HAND);
                /* Put a string on a dragboard */
                ClipboardContent content = new ClipboardContent();
                content.putString(source.getText());
                db.setContent(content);

                event.consume();
            }
        });        


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


        target.setOnDragOver(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                /* data is dragged over the target */
                /* 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 moving */
                    event.acceptTransferModes(TransferMode.MOVE);
                }

                event.consume();
            }
        });

        target.setOnDragEntered(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
            /* the drag-and-drop gesture entered the target */
            /* 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>() {
            @Override
            public void handle(DragEvent event) {
                /* mouse moved away, remove the graphical cues */
                target.setFill(Color.BLACK);

                event.consume();
            }
        });

        target.setOnDragDropped(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                /* data dropped */
                /* if there is a string data on dragboard, read it and use it */
                System.out.println(hasBeenOffScreen[0]);
                if(hasBeenOffScreen[0] == true)
                {
                    event.setDropCompleted(false);

                }
                else
                {
                    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();
             }
        });


        Pane root = new Pane();
        root.getChildren().addAll(source, target);

        Scene scene = new Scene(root, 500, 500);
//        scene.setOnDragOver(event -> {
//            
//                scene.setCursor(Cursor.DEFAULT);
//                System.out.println(event.getX());
//                System.out.println(scene.getX());
//                System.out.println(scene.getWidth());
//                
//                if(event.getX() >= scene.getWidth())
//                {
//                    System.out.println("Out of scene!");
//                   // Dragboard db = source.startDragAndDrop(TransferMode.ANY);
//                     hasBeenOffScreen[0] = true;
//                    event.consume();
//                }
//          });     

        scene.setOnDragExited(event ->{
            hasBeenOffScreen[0] = true;
            System.out.println("Off scene!");

        });
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    class Delta{double x, y;}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

【讨论】:

  • 感谢您的回答。如我所见,您只是向用户模拟他没有拖动任何东西,只是视觉上的东西,对吗?我会检查是否没有其他方法可以实际取消拖动操作,如果没有,我会接受您的回答,因为这可能是唯一的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多