如何在 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); } }
輸出
廣告