如何将 JavaFX 节点从一个位置移动(平移)到另一个位置?

javafxobject oriented programmingprogramming更新于 2025/4/14 6:52:17

如果将对象在 XY 平面上从一个位置移动到另一个位置,这称为平移。您可以沿 X 轴或 Y 轴平移对象。

在 JavaFX 中,使用 javafx.scene.transform.Translate 类的对象,您可以将节点从一个位置平移到另一个位置。该类包含三个属性(双精度型),分别表示目标位置沿 X、Y、Z 平面与原始位置的距离。

JavaFX 中的每个节点都包含一个可观察列表,用于保存要应用于节点的所有变换。您可以使用 getTransforms() 方法获取此列表。

将节点从一个位置移动到另一个位置 −

  • 实例化 Translate 类。

  • 分别使用 setX()、setY()setZ() 方法设置节点在 XYZ 平面中移动的距离。

  • 使用 getTransforms() 方法获取节点(您想要移动的节点)的变换列表。

  • 将上面创建的比例对象添加到该节点。

  • 将节点添加到场景。

示例

遵循 JavaFX 示例演示平移变换。它包含一个二维几何形状和两个滑块,分别代表 x 和 y 轴的平移值。移动滑块时,对象会沿着选定的轴移动。

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.paint.PhongMaterial;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
public class TranslateExample extends Application {
   public void start(Stage stage) {
      //绘制球体
      Sphere sphere = new Sphere();
      sphere.setRadius(50.0);
      sphere.setCullFace(CullFace.BACK);
      sphere.setDrawMode(DrawMode.FILL);
      PhongMaterial material = new PhongMaterial();
      material.setDiffuseColor(Color.BROWN);
      sphere.setMaterial(material);
      //设置滑块的水平平移
      Slider slider1 = new Slider(0, 500, 0);
      slider1.setOrientation(Orientation.VERTICAL);
      slider1.setShowTickLabels(true);
      slider1.setShowTickMarks(true);
      slider1.setMajorTickUnit(150);
      slider1.setBlockIncrement(150);
      //创建平移变换
      Translate translate = new Translate();
      //将变换链接到滑块
      slider1.valueProperty().addListener(new ChangeListener<Number>() {
         public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){
            translate.setX((double) newValue);
            translate.setY(0);
            translate.setZ(0);
         }
      });
      //设置滑块的垂直平移
      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() {
          public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){
              transform.setX(0);
            translate.setY((double) newValue);
         }
      });
      //为球体添加变换
      sphere.getTransforms().add(translate);
      //创建窗格
      BorderPane pane = new BorderPane();
      pane.setBottom(new VBox(new Label("沿 X 轴平移"), slider1));
      pane.setRight(new VBox(new Label("沿 Y 轴平移"), slider2));
      pane.setLeft(sphere);
      //准备场景
      Scene scene = new Scene(pane, 595, 300);
      stage.setTitle("Translate Example");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

输出


相关文章