我尝试用鼠标改变矩形。左上角应该固定。没有任何旋转的矩形,它的工作原理。但如果旋转矩形,它就不再起作用了。
所有尝试使用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);
}}
答案 0 :(得分:1)
如果您只是设置节点的rotate
属性,它将围绕其中心点旋转该节点。如果您随后更改尺寸,则中心将移动,因此您将看到矩形的另一端移动。
要保持该点固定,请围绕该点执行旋转。而不是
recGroup.setRotate(angle);
DO
Rotate rotate = new Rotate(angle, 0, 0);
recGroup.getTransforms().add(rotate);
您可能需要添加一些翻译,或者只是移动原始矩形,但这会保持矩形的(0,0)点固定。