如何在 JavaFX 中旋转节点?

javafxobject oriented programmingprogramming更新于 2025/6/26 3:22:17

如果在 XY 平面上围绕一个固定点以一定角度移动一个对象,则称为旋转。

在 JavaFX 中,使用 javafx.scene.transform.Rotate 类的对象,可以旋转节点。该类内部围绕给定的固定点旋转节点的坐标空间,使节点看起来像是旋转了一样。

该类包含五个属性 −

  • angle 属性(双精度型)指定旋转角度。您可以使用 setAngle() 方法设置此属性的值。

  • axis 属性(Point3D)指定旋转轴。您可以使用 setAxis() 方法设置此属性的值。

  • pivotX 属性(双精度型)指定枢轴点的 x 坐标。您可以使用 setPivotX() 方法设置此属性的值。

  • pivotY 属性(双精度型)指定枢轴点的 y 坐标。您可以使用 setPivotY() 方法设置此属性的值。

  • pivotZ 属性(双精度型)指定枢轴点的 z 坐标。您可以使用 setPivotZ() 方法设置此属性的值。

JavaFX 中的每个节点都包含一个可观察列表,用于保存要应用于该节点的所有变换。您可以使用 getTransforms() 方法获取此列表。

在 JavaFX 中旋转节点 −

  • 实例化 Rotate 类。

  • 使用 setter 方法设置角度和枢轴点。

  • 使用 getTransforms() 方法从节点(要旋转的节点)获取变换列表。

  • 将上面创建的旋转对象添加到该节点。

  • 将节点添加到场景。

示例

以下 JavaFX 示例演示了旋转变换。它包含一个 2D 几何形状和一个滑块,用于表示角度值。如果移动滑块,对象将会旋转。

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) {
      //创建矩形
      Rectangle rect = new Rectangle(300, 100, 75, 75);
      rect.setFill(Color.BLUEVIOLET);
      rect.setStrokeWidth(5.0);
      rect.setStroke(Color.BROWN);
      //设置滑块
      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);
      //创建旋转变换
      Rotate rotate = new Rotate();
      //设置旋转的枢轴点
      rotate.setPivotX(300);
      rotate.setPivotY(100);
      //将变换添加到矩形
      rect.getTransforms().addAll(rotate);
      //将变换链接到滑块
      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);
         }
      });
      //为圆形添加变换
      rect.getTransforms().add(rotate);
      //创建窗格
      BorderPane pane = new BorderPane();
      pane.setRight(new VBox(new Label("Rotate"), slider));
      pane.setCenter(rect);
      //准备场景
      Scene scene = new Scene(pane, 600, 300);
      stage.setTitle("Rotation Example");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

输出


相关文章