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

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

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

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

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

  • 实例化Translate类。

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

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

  • 向其添加上面创建的比例对象。

  • 将节点添加到场景。

示例

以下JavaFX示例演示了转换转换。它包含2D几何形状和两个滑块,分别表示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<Number>() {
         public void changed(ObservableValue <?extends Number>observable, Number oldValue, Number newValue){
            translate.setX(0);
            translate.setY((double) newValue);
         }
      });
      //将变换添加到球体
      sphere.getTransforms().add(translate);
      //创建窗格
      BorderPane pane = new BorderPane();
      pane.setBottom(new VBox(new Label("Translate along X-Axis"), slider1));
      pane.setRight(new VBox(new Label("Translate along Y-Axis"), 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);
   }
}

输出结果