JavaFX:使用形状旋转变换不适用于固定点

时间:2015-09-11 13:32:54

标签: javafx draggable rotatetransform

我尝试用鼠标改变矩形。左上角应该固定。没有任何旋转的矩形,它的工作原理。但如果旋转矩形,它就不再起作用了。

所有尝试使用sceneToLocal,反之亦然,并使用“rectangle.getTransforms()。add(new Rotate(-ang,w,h));”不行。如果角度<> 0!

,则fixPoint无法修复

有人有任何想法吗?

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RotatedRectangle extends Application {

    private final int TSIZE = 12;
    Rectangle rec,fixPoint;
double angle =0;// 0 works fine, but for other angle the fixPoint is not fix!

@Override
public void start(Stage primaryStage) {

    Group recGroup = new Group();
    recGroup.setRotate(angle);
    rec = new Rectangle(100,100,300, 200);
    rec.setFill(Color.TRANSPARENT);
    rec.setStroke(Color.BLUE);
    fixPoint = new Rectangle(10,10);
    fixPoint.xProperty().bind(rec.xProperty());
    fixPoint.yProperty().bind(rec.yProperty());
    Rectangle recSE = TouchRectangle(
            rec.xProperty().add(rec.widthProperty()).subtract(TSIZE),
            rec.yProperty().add(rec.heightProperty()).subtract(TSIZE));

    recGroup.getChildren().addAll(rec, recSE,fixPoint);
    Pane root = new Pane();
    root.getChildren().add(recGroup);

    Scene scene = new Scene(root, 600, 400);

    primaryStage.setTitle("Rotated Rectangle");
    primaryStage.setScene(scene);
    primaryStage.show();
}


private Rectangle TouchRectangle(ObservableValue<? extends Number> x, ObservableValue<? extends Number> y) {
    Rectangle r = new Rectangle();
    r.setHeight(TSIZE);
    r.setWidth(TSIZE);
    r.setFill(Color.TRANSPARENT);
    r.setStroke(Color.RED);
    r.xProperty().bind(x);
    r.yProperty().bind(y);        
    r.setOnMouseDragged(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            Point2D zero = rec.localToScene(rec.getX() + rec.getWidth(),
                    rec.getY() + rec.getHeight());                
            double newX = (event.getSceneX() - zero.getX());
            double newY = (event.getSceneY() - zero.getY());
            rec.setWidth(rec.getWidth() +newX);
            rec.setHeight(rec.getHeight() +newY);
            Point2D fixP = fixPoint.localToScene(fixPoint.getX(), fixPoint.getY());
            System.out.println("FIX??"+fixP);
        }
    });
    return r;
}

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

1 个答案:

答案 0 :(得分:1)

如果您只是设置节点的rotate属性,它将围绕其中心点旋转该节点。如果您随后更改尺寸,则中心将移动,因此您将看到矩形的另一端移动。

要保持该点固定,请围绕该点执行旋转。而不是

recGroup.setRotate(angle);

DO

Rotate rotate = new Rotate(angle, 0, 0);
recGroup.getTransforms().add(rotate);

您可能需要添加一些翻译,或者只是移动原始矩形,但这会保持矩形的(0,0)点固定。