JavaFX 在节点上应用多种变换的示例
javafxobject oriented programmingprogramming更新于 2025/6/26 3:07:17
变换是指节点在 XY 平面上的改变。JavaFX 支持四种基本变换,即 和 。
缩放 和 ;增大或减小尺寸。
旋转 和 ;节点坐标围绕固定点以一定角度移动。
平移 和 ;节点在 XY 平面上的移动。
剪切 和 ;对象沿固定方向的位移,使其形状倾斜。
JavaFX 中的每个节点都包含一个可观察列表,用于保存要应用于节点的所有变换。您可以使用 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.scene.transform.Scale; import javafx.scene.transform.Translate; import javafx.stage.Stage; public class MultipleTransformations 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 slider1 = new Slider(0, 360, 0); Rotate rotate = new Rotate(); //设置旋转的枢轴点 rotate.setPivotX(rect.getX()); rotate.setPivotY(rect.getY()); //设置旋转滑块 slider1.setShowTickLabels(true); slider1.setShowTickMarks(true); slider1.setMajorTickUnit(90); slider1.setBlockIncrement(10); slider1.setOrientation(Orientation.VERTICAL); slider1.valueProperty().addListener(new ChangeListener<Number>() { public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){ //设置旋转角度 rotate.setAngle((double) newValue); } }); //创建平移变换 Translate translate = new Translate(); //设置平移滑块 Slider slider2 = new Slider(0, 200, 0); slider2.setOrientation(Orientation.VERTICAL); slider2.setShowTickLabels(true); slider2.setShowTickMarks(true); slider2.setMajorTickUnit(50); slider2.setBlockIncrement(50); slider2.valueProperty().addListener(new ChangeListener<Number>() { public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){ translate.setX(25); translate.setY((double) newValue); translate.setZ(100); } }); //创建缩放变换 Scale scale = new Scale(); scale.setPivotX(rect.getX()); scale.setPivotY(rect.getY()); //设置水平平移的滑块 Slider slider3 = new Slider(0, 2.5, 1); slider3.setShowTickLabels(true); slider3.setShowTickMarks(true); slider3.setMajorTickUnit(0.5); slider3.setBlockIncrement(0.1); slider3.valueProperty().addListener(new ChangeListener<Number>() { public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){ scale.setX((double) newValue); scale.setY((double) newValue); } }); //将所有变换添加到节点 rect.getTransforms().addAll(translate, rotate, scale); //创建窗格 BorderPane pane = new BorderPane(); pane.setRight(new VBox(new Label("Rotate"); slider1)); pane.setCenter(rect); pane.setBottom(new VBox(new Label("Translate (Y axis)"); slider2)); pane.setLeft(new VBox(new Label("Scale"), slider3)); //准备场景 Scene scene = new Scene(pane, 595, 300); stage.setTitle("Multiple Transformations"); stage.setScene(scene); stage.show(); } public static void main(String args[]){ launch(args); } }