如何为JavaFX拖拽板设置一个空的DragView?

时间:2014-10-08 11:07:56

标签: javafx

我正在研究一个涉及在窗格上移动圆圈的JavaFX应用程序。代码工作正常,但拖动对象时会出现一个文件图标。

我可以使用Circle对象setOnDragDetected中的代码将图像设置为新图像:

Dragboard db = startDragAndDrop(TransferMode.MOVE);
db.setDragView(new Image("/my_image.jpg"));

但是我根本不想要任何图像,如果我使用db.setDragView(null),我会再次获得默认文件图标(即使db.getDragView()==null)。

这里发生了什么?如何在拖动时禁用图像使用?

2 个答案:

答案 0 :(得分:2)

这是一个基本的例子。我还在圆圈之间添加了一条线,向您展示将节点绑定在一起是多么容易:

public class DragNodes extends Application {

    public static List<Circle> circles = new ArrayList<Circle>();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();

        Circle circle1 = new Circle( 100, 100, 50);
        circle1.setStroke(Color.GREEN);
        circle1.setFill(Color.GREEN.deriveColor(1, 1, 1, 0.3));

        Circle circle2 = new Circle( 200, 200, 50);
        circle2.setStroke(Color.BLUE);
        circle2.setFill(Color.BLUE.deriveColor(1, 1, 1, 0.3));

        Line line = new Line();
        line.setStrokeWidth(20);

        // binding
        line.startXProperty().bind(circle1.centerXProperty());
        line.startYProperty().bind(circle1.centerYProperty());
        line.endXProperty().bind(circle2.centerXProperty());
        line.endYProperty().bind(circle2.centerYProperty());

        MouseGestures mg = new MouseGestures();
        mg.makeDraggable( circle1);
        mg.makeDraggable( circle2);
        mg.makeDraggable( line);

        root.getChildren().addAll(circle1, circle2, line);

        primaryStage.setScene(new Scene(root, 1024, 768));
        primaryStage.show();
    }



    public static class MouseGestures {

        class DragContext {
            double x;
            double y;
        }

        DragContext dragContext = new DragContext();

        public void makeDraggable( Node node) {
            node.setOnMousePressed( onMousePressedEventHandler);
            node.setOnMouseDragged( onMouseDraggedEventHandler);
            node.setOnMouseReleased(onMouseReleasedEventHandler);
        }

        EventHandler<MouseEvent> onMousePressedEventHandler = event -> {

            if( event.getSource() instanceof Circle) {

                Circle circle = ((Circle) (event.getSource()));

                dragContext.x = circle.getCenterX() - event.getSceneX();
                dragContext.y = circle.getCenterY() - event.getSceneY();

            } else {

                Node node = ((Node) (event.getSource()));

                dragContext.x = node.getTranslateX() - event.getSceneX();
                dragContext.y = node.getTranslateY() - event.getSceneY();

            }
        };

        EventHandler<MouseEvent> onMouseDraggedEventHandler = event -> {

            if( event.getSource() instanceof Circle) {

                Circle circle = ((Circle) (event.getSource()));

                circle.setCenterX( dragContext.x + event.getSceneX());
                circle.setCenterY( dragContext.y + event.getSceneY());

            } else {

                Node node = ((Node) (event.getSource()));

                node.setTranslateX( dragContext.x + event.getSceneX());
                node.setTranslateY( dragContext.y + event.getSceneY());

            }

        };

        EventHandler<MouseEvent> onMouseReleasedEventHandler = event -> {
            // nothing to do
        };

    }

}

enter image description here

答案 1 :(得分:0)

我认为没有办法没有dragView。我建议创建一个非常小的图像(例如10x10px),它是透明的,并将其用于dragView。所以什么也看不见。