JavaFX 在节点上应用多种变换的示例
javafxobject oriented programmingprogramming更新于 2026/1/8 1:16: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);
}
}
输出


