如何在 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+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.