| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 
 | import java.io.File;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Region;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
 
public class Main extends Application {
 
    private final ImageView vueCarte = new ImageView();
    private final Region mapArea = new Region() {
        {
            getChildren().add(vueCarte);
        }
    };
 
    @Override
    public void start(Stage primaryStage) {
        final File file = new File("C:\\Users\\Fabriceb\\Pictures\\Outland.jpg");
        final Image image = new Image(file.toURI().toString(), true);
        vueCarte.setImage(image);
        final Rectangle2D viewport = new Rectangle2D(0, 0, 500, 500);
        vueCarte.setViewport(viewport);
        vueCarte.setOnMousePressed(this::handleMousePressed);
        vueCarte.setOnMouseDragged(this::handleMouseDragged);
        vueCarte.setOnScroll(this::handleZoom);
        vueCarte.getTransforms().add(scale);
        Platform.runLater(() -> {
            mapArea.widthProperty().addListener(this::mapAreaSizeChanged);
            mapArea.heightProperty().addListener(this::mapAreaSizeChanged);
        });
        final BorderPane root = new BorderPane();
        root.setCenter(mapArea);
        Scene scene = new Scene(root, 500, 500);
        primaryStage.setTitle("Test ImageView BorderPane");
        primaryStage.setScene(scene);
        primaryStage.show();
//        ScenicView.show(scene);
    }
 
    private double startX;
    private double startY;
 
    private void handleMousePressed(MouseEvent e) {
        startX = e.getX();
        startY = e.getY();
    }
 
    private void handleMouseDragged(MouseEvent e) {
 
        double draggedDistanceX = startX - e.getX();
        double draggedDistanceY = startY - e.getY();
 
        startX = e.getX();
        startY = e.getY();
 
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
 
        final Rectangle2D viewport = vueCarte.getViewport();
        double curMinX = viewport.getMinX();
        double curMinY = viewport.getMinY();
 
        double newMinX = curMinX + draggedDistanceX;
        double newMinY = curMinY + draggedDistanceY;
        newMinX = clamp(newMinX, 0, Math.max(0, vueCarte.getImage().getWidth() - viewWidth));
        newMinY = clamp(newMinY, 0, Math.max(0, vueCarte.getImage().getHeight() - viewHeight));
        vueCarte.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        System.out.printf("%f x %f \t %f x %f%n", newMinX, newMinY, vueCarte.getImage().getWidth(), vueCarte.getImage().getHeight());
    }
 
    double clamp(double min, double value, double max) {
        double result = Math.max(min, value);
        result = Math.min(result, max);
        return result;
    }
 
    private void mapAreaSizeChanged(Observable o) {
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
        final Rectangle2D viewport = vueCarte.getViewport();
        if (viewport.getWidth() != viewWidth || viewport.getHeight() != viewHeight) {
            double newMinX = viewport.getMinX();
            double newMinY = viewport.getMinY();
            newMinX = clamp(newMinX, 0, Math.max(0, vueCarte.getImage().getWidth() - viewWidth));
            newMinY = clamp(newMinY, 0, Math.max(0, vueCarte.getImage().getHeight() - viewHeight));
            vueCarte.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        }
    }
 
    private double zoom = 1.0;
    private Scale scale = new Scale(zoom, zoom);
    private static final double MIN_ZOOM = 0.5;
    private static final double MAX_ZOOM = 2.0;
 
    private void handleZoom(ScrollEvent event) {
        double delta = event.getDeltaY();
        double newZoom = zoom;
        if (delta < 0) {
            newZoom /= 2;
        }
        if (delta > 0) {
            newZoom *= 2;
        }
        newZoom = clamp(MIN_ZOOM, newZoom, MAX_ZOOM);
        if (newZoom == zoom) {
            return;
        }
        zoom = newZoom;
        System.out.printf("Zoom: %f%n", zoom);
        scale.setX(zoom);
        scale.setY(zoom);
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
        final Rectangle2D viewport = vueCarte.getViewport();
        if (viewport.getWidth() != viewWidth || viewport.getHeight() != viewHeight) {
            double newMinX = viewport.getMinX();
            double newMinY = viewport.getMinY();
            newMinX = clamp(newMinX, 0, Math.max(0, vueCarte.getImage().getWidth() - viewWidth));
            newMinY = clamp(newMinY, 0, Math.max(0, vueCarte.getImage().getHeight() - viewHeight));
            vueCarte.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        }
    }
 
    public static void main(String[] args) {
        launch(args);
    }
} | 
Partager