-1

JavaFX でマウスをドラッグしたときに形状を作成する方法を学んでいます。マウスをドラッグすると形状を作成できますが、その形状を含むとを変更するscaleXと問題が発生します。問題は、スケールが 1 でないときに形状を作成しようとすると、マウスの位置に応じて変換値を設定するコードを記述したときに、形状の位置が変更されることです。この問題を何度も解決しようとしましたが、なぜこれが起こっているのか、この問題を解決する方法がわかりません。scaleYGroup

ここに私のコードがあります:

Rectangleマウスがドラッグされたときに呼び出される変更するコードを使用していますobjectが、マウスをドラッグすると1以外のスケールを維持して位置がずれます。マウスがドラッグされたときに長方形を作成しようとしています。しかし、その位置はマウスがある場所ではありません。つまり、グループのスケールが1でない場合、位置がシフトされます。

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Example extends Application{
    
    private Group  group;
    private double mousePointX;
    private double mousePointY;
    
    public static void main(String... arguments){ launch(arguments); }
    
    @Override public void start(Stage primaryStage){
        
        group = new Group();
        
        Pane pane = new Pane(group);
        pane.setOnMousePressed(this::recordPosition);
        pane.setOnMouseDragged(this::makeShape);
        pane.setOnScroll(this::handleScroll);
        
        primaryStage.setScene(new Scene(new BorderPane(pane)));
        primaryStage.show();
    }
    
    //record mouse position
    private void recordPosition(MouseEvent event){
        mousePointX = event.getX();
        mousePointY = event.getY();
    }
    
    //method to make shape
    private void makeShape(MouseEvent event){
        Rectangle object;
        object = new Rectangle(200, 200, Color.BLUE);
        object.setStroke(Color.BLACK);
    
        group.getChildren().addAll(object);
        
        object.setTranslateX(mousePointX - group.getTranslateX());
        object.setTranslateY(mousePointY - group.getTranslateY());
        object.setHeight(event.getY() - mousePointY);
        object.setWidth(event.getX() - mousePointX);
    }
    
    //method to control scroll
    private void handleScroll(ScrollEvent event){
        if(event.isControlDown()){
            zoom(Math.pow(1.01, event.getDeltaY()), event.getSceneX(), event.getSceneY());
        }else{
            group.setTranslateX(this.group.getTranslateX() + event.getDeltaX());
            group.setTranslateY(this.group.getTranslateY() + event.getDeltaY());
        }
        event.consume();
    }
    
    //method to control zoom
    private void zoom(double factor, double x, double y){
        double oldScale = group.getScaleX();
        double scale    = oldScale * factor;
        
        if(scale < 0.05) scale = 0.05;
        if(scale > 50) scale = 50;
        
        group.setScaleX(scale);
        group.setScaleY(scale);
        
        double f      = (scale / oldScale) - 1;
        Bounds bounds = this.group.localToScene(this.group.getBoundsInLocal());
        double dx     = (x - (bounds.getWidth() / 2 + bounds.getMinX()));
        double dy     = (y - (bounds.getHeight() / 2 + bounds.getMinY()));
        
        group.setTranslateX(this.group.getTranslateX() - f * dx);
        group.setTranslateY(this.group.getTranslateY() - f * dy);
    }
    
}

では、そのシェイプを含むグループのスケールが 1 でない場合、そのシェイプを描画する正しい方法は何ですか??

私に提案してください。

4

1 に答える 1