1 2 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