如何在 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); } }