2017-04-12 177 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); 
      } 
     }); 
    } 
};