如何在 JavaFX 中旋轉節點?


如果在 XY 平面內圍繞一個固定點以一定角度移動一個物件,則稱為旋轉。

在 JavaFX 中,可以使用 **javafx.scene.transform.Rotate** 類的物件來旋轉節點。此類在內部圍繞給定的固定點旋轉節點的座標空間,這使得節點看起來像旋轉了。

此類包含五個屬性:

  • **_angle_** 屬性(double)指定旋轉角度。可以使用 **setAngle()** 方法為此屬性設定值。

  • **_axis_** 屬性 (Point3D) 指定旋轉軸。可以使用 **setAxis()** 方法為此屬性設定值。

  • **_pivotX_** 屬性(double)指定樞軸點的 x 座標。可以使用 **setPivotX()** 方法為此屬性設定值。

  • **_pivotY_** 屬性(double)指定樞軸點的 y 座標。可以使用 **setPivotY()** 方法為此屬性設定值。

  • **_pivotZ_** 屬性(double)指定樞軸點的 z 座標。可以使用 **setPivotZ()** 方法為此屬性設定值。

JavaFX 中的每個節點都包含一個可觀察列表,用於儲存要應用於節點的所有變換。可以使用 **getTransforms()** 方法獲取此列表。

要在 JavaFX 中旋轉節點:

  • 例項化 **_Rotate_** 類。

  • 使用 setter 方法設定角度和樞軸點。

  • 使用 getTransforms() 方法從節點(要旋轉的節點)獲取變換列表。

  • 將上面建立的旋轉物件新增到其中。

  • 將節點新增到場景中。

示例

下面的 JavaFX 示例演示了旋轉變換。它包含一個二維幾何形狀和一個滑塊,代表角度值。如果移動滑塊,則物件將旋轉。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
public class RotationExample extends Application {
   public void start(Stage stage) {
      //Creating a rectangle
      Rectangle rect = new Rectangle(300, 100, 75, 75);
      rect.setFill(Color.BLUEVIOLET);
      rect.setStrokeWidth(5.0);
      rect.setStroke(Color.BROWN);
      //Setting the slider
      Slider slider = new Slider(0, 360, 0);
      slider.setShowTickLabels(true);
      slider.setShowTickMarks(true);
      slider.setMajorTickUnit(90);
      slider.setBlockIncrement(10);
      slider.setOrientation(Orientation.VERTICAL);
      slider.setLayoutX(2);
      slider.setLayoutY(195);
      //creating the rotation transformation
      Rotate rotate = new Rotate();
      //Setting pivot points for the rotation
      rotate.setPivotX(300);
      rotate.setPivotY(100);
      //Adding the transformation to rectangle
      rect.getTransforms().addAll(rotate);
      //Linking the transformation to the slider
      slider.valueProperty().addListener(new ChangeListener<Number>() {
         public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){
            //Setting the angle for the rotation
            rotate.setAngle((double) newValue);
         }
      });
      //Adding the transformation to the circle
      rect.getTransforms().add(rotate);
      //Creating the pane
      BorderPane pane = new BorderPane();
      pane.setRight(new VBox(new Label("Rotate"), slider));
      pane.setCenter(rect);
      //Preparing the scene
      Scene scene = new Scene(pane, 600, 300);
      stage.setTitle("Rotation Example");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

輸出

更新於:2020年5月19日

3K+ 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告