リビジョン be89b40a
| learn/java/javafx/ZoomPanCanvas/src/zoompancanvas/ZoomPanCanvasController.java | ||
|---|---|---|
|
public class ZoomPanCanvasController implements Initializable {
|
||
|
|
||
|
private static final Logger logger = Logger.getLogger(ZoomPanCanvasController.class.getName());
|
||
|
private static final Affine IDENTITY_TRANSFORM = new Affine(1f, 0f, 0f, 0f, 1f, 0);
|
||
|
private static final double RADIUS = 10_000f;
|
||
|
|
||
|
@FXML
|
||
| ... | ... | |
|
@FXML
|
||
|
private Label scaleLabel;
|
||
|
private DoubleProperty scale = new SimpleDoubleProperty(1.0);
|
||
|
private double translateX;
|
||
|
private double translateY;
|
||
|
private Point2D dragStartPoint;
|
||
|
private Point2D translate = new Point2D(0f, 0f);
|
||
|
private Point2D prevDragPoint;
|
||
|
|
||
|
@FXML
|
||
|
private void handleButtonAction(ActionEvent event) {
|
||
| ... | ... | |
|
public void initialize(URL url, ResourceBundle rb) {
|
||
|
scaleLabel.textProperty().bindBidirectional(scale, new NumberStringConverter());
|
||
|
canvas.setOnScroll(ev -> {
|
||
|
scale.set((ev.getDeltaY() >= 0) ? scale.get() * 2f : scale.get() / 2f);
|
||
|
scale.set((ev.getDeltaY() >= 0) ? scale.get() * 1.4f : scale.get() / 1.4f);
|
||
|
drawCanvas();
|
||
|
});
|
||
|
canvas.setOnMousePressed(ev -> {
|
||
|
dragStartPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
|
||
|
logger.info("OnMousePressed, dragPoint(scene xy) is " + dragStartPoint);
|
||
|
prevDragPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
|
||
|
logger.info(() -> String.format("OnMousePressed, sceneXY=(%f, %f)", ev.getSceneX(), ev.getSceneY()));
|
||
|
});
|
||
|
canvas.setOnMouseDragged(ev -> {
|
||
|
double deltaX = ev.getSceneX() - dragStartPoint.getX();
|
||
|
double deltaY = ev.getSceneY() - dragStartPoint.getY();
|
||
|
translateX += deltaX;
|
||
|
translateY += deltaY;
|
||
|
logger.info("onMouseDragged, moved is " + deltaX + "," + deltaY);
|
||
|
Point2D dragPoint = new Point2D(ev.getSceneX(), ev.getSceneY());
|
||
|
translate = translate.add(dragPoint.subtract(prevDragPoint));
|
||
|
prevDragPoint = dragPoint;
|
||
|
logger.info(() -> String.format("OnMouseDragged, sceneXY=(%f, %f), translate=%s",
|
||
|
ev.getSceneX(), ev.getSceneY(), translate));
|
||
|
drawCanvas();
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
private void drawCanvas() {
|
||
| ... | ... | |
|
GraphicsContext gc = canvas.getGraphicsContext2D();
|
||
|
logger.info(() -> String.format("GraphicsContext's transform=%s%n", gc.getTransform().toString()));
|
||
|
clearCanvas();
|
||
|
gc.setTransform(getZoomPanTransform(scale.get(), translateX, translateY));
|
||
|
gc.setTransform(getZoomPanTransform(scale.get(), translate));
|
||
|
gc.setStroke(Color.DARKBLUE);
|
||
|
gc.setLineWidth(1 / scale.get());
|
||
|
gc.strokeLine(-RADIUS, 0, RADIUS, 0);
|
||
| ... | ... | |
|
|
||
|
private void clearCanvas() {
|
||
|
GraphicsContext gc = canvas.getGraphicsContext2D();
|
||
|
gc.setTransform(getZoomPanTransform(1f, 0, 0));
|
||
|
gc.setTransform(IDENTITY_TRANSFORM);
|
||
|
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
|
||
|
}
|
||
|
|
||
|
private Affine getZoomPanTransform(double scale, double tx, double ty) {
|
||
|
return new Affine(scale, 0, tx, 0, scale, ty);
|
||
|
private Affine getZoomPanTransform(double scale, Point2D translate) {
|
||
|
return new Affine(scale, 0, translate.getX(), 0, -scale, translate.getY());
|
||
|
}
|
||
|
|
||
|
}
|
||
マウスのドラッグ操作でのパン(スクロール)がうまくいっていないバグを修正