JavaFX鼠标拖拽移动图片

一、鼠标拖拽移动图片

package cn.util;

import java.io.File;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author MK
 */
public class ImageApplication extends Application {

    Point2D dragDistance = null;
    
    public void start(Stage primaryStage) {

        ImageView imageView = new ImageView();
        String file = new File("picture1.png").toURI().toString();
        System.out.println(file);
        Image image = new Image(file);
        imageView.setImage(image);
        
        final double w = image.getWidth();
        final double h = image.getHeight();
        final double max = Math.max(w, h);
        final int width = (int) (500 * w / max);
        final int heigth = (int) (500 * h / max);
        imageView.setFitHeight(heigth);
        imageView.setFitWidth(width);

        Pane pane = new Pane();
        StackPane stackPane = new StackPane(pane);
        Scene scene = new Scene(stackPane, 700, 800);
        pane.getChildren().add(imageView);
        pane.heightProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                imageView.setY((newValue.doubleValue() - imageView.getFitHeight()) / 2);
            }

        });

        pane.widthProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                imageView.setX((newValue.doubleValue() - imageView.getFitWidth()) / 2);
            }

        });
        
        stackPane.addEventFilter(MouseDragEvent.MOUSE_PRESSED, event -> {
            dragDistance = new Point2D(event.getSceneX(), event.getSceneY());
            dragDistance = dragDistance.subtract(pane.localToScene(new Point2D(imageView.getX(), imageView.getY())));

        });

        stackPane.addEventFilter(MouseDragEvent.MOUSE_DRAGGED, event -> {
            if (event.isPrimaryButtonDown()) {

                Point2D px = new Point2D(event.getSceneX(), event.getSceneY());
                px = pane.sceneToLocal(px.subtract(dragDistance));
                imageView.setX(px.getX());
                imageView.setY(px.getY());
            }
        });
        

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值