2017-04-12 146 views
0

我刚开始使用JavaFX并且有一个问题。在我的项目中,我想使用旋转的矩形。但矩形只能围绕其中心旋转,而且我希望它围绕左上角旋转。JavaFX在其转角处旋转矩形

就像在这张照片(从here):

enter image description here

这里是一些代码,就像在我的项目:

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.input.KeyCode; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.scene.shape.Rectangle; 

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.util.*; 

public class Main extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     Group root = new Group(); 
     Scene scene = new Scene(root, 500, 500); 

     //create rectangle 
     Rectangle rect = new Rectangle(10, 10, 200, 15); 
     rect.setTranslateX(250); 
     rect.setTranslateY(250); 
     rect.setFill(Color.BLACK); 

     root.getChildren().add(rect); 

     AnimationTimer timer = new AnimationTimer() { 
      @Override 
      public void handle(long now) { 
       stage.getScene().setOnKeyPressed(e -> { 
        if (e.getCode() == KeyCode.LEFT) { 
         rect.setRotate(rect.getRotate()-5);  //<-- rotate rectangle here 
        } else if (e.getCode() == KeyCode.RIGHT){ 
         rect.setRotate(rect.getRotate()+5);  //<-- rotate rectangle here 
        } 
       }); 
      } 
     }; 
     timer.start(); 

     stage.setScene(scene); 
     stage.show(); 
    } 

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

在这种情况下,如果按下方向键矩形旋转。

回答

1

您需要专门使用TransformRotate来围绕自定义透视旋转节点。

//Create a Rotate Object 
Rotate rotate = new Rotate(); 
rotate.setPivotX(node.getX()); //Pivot X Top-Left corner 
rotate.setPivotY(node.getY()); //Pivot Y 
rotate.setAngle(angle); //Angle degrees 

//Add the transform to the node 
node.getTransforms().add(rotate); 

在你的代码

final Rotate rotate = new Rotate(); 
rect.getTransforms().add(rotate); 

AnimationTimer timer = new AnimationTimer() { 
    @Override 
    public void handle(long now) { 
     stage.getScene().setOnKeyPressed(e -> { 
      rotate.setPivotX(rect.getX()); 
      rotate.setPivotY(rect.getY()); 
      if (e.getCode() == KeyCode.LEFT) { 
       rotate.setAngle(rotate.getAngle() - 5); 
      } else if (e.getCode() == KeyCode.RIGHT){ 
       rotate.setAngle(rotate.getAngle() + 5); 
      } 
     }); 
    } 
};