The JavaFX Transformation support enables you to transform (translate, rotate, scale, shear) JavaFX nodes attached to the JavaFX scene graph. In this JavaFX Transformation tutorial I will take a closer look at how transformations work in JavaFX.
JavaFX Transformation Example
Here is a full JavaFX Transformation example to show you how JavaFX Transformations work:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
public class TransformationsExample extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
Rectangle rectangle = new Rectangle();
rectangle.setX(200);
rectangle.setY(200);
rectangle.setWidth(300);
rectangle.setHeight(400);
rectangle.setStroke(Color.TRANSPARENT);
rectangle.setFill(Color.valueOf("#00ffff"));
double degrees = 30;
double rotationPointX = 100;
double rotationPointY = 100;
Transform rotate = Transform.rotate(degrees, rotationPointX, rotationPointY);
rectangle.getTransforms().add(rotate);
Transform translate = Transform.translate(100, 0);
rectangle.getTransforms().add(translate);
Pane pane = new Pane();
pane.getChildren().add(rectangle);
Scene scene = new Scene(pane, 1024, 800, true);
primaryStage.setScene(scene);
primaryStage.setTitle("2D Example");
primaryStage.show();
}
}
Transformation Objects
A JavaFX transformation is represented by a Transformation object of some kind. The JavaFX Transform class, javafx.scene.transform.Transform
contains a few factory methods you can use to create instances of the Transform class. Here is an example:
Transform translate = Transform.translate(100, 0);
There are also some transformation classes you can use instead of the Transform factory methods. I will cover some of those in the following sections.
Add a Transformation to a JavaFX Control
You add a transformation to a JavaFX control by adding a Transform instance to the control via the this operation:
control.getTransforms().add(transformationObject);
Built-in Transformations
JavaFX comes with a set of built-in transformations you can use. These transformations are:
- Translate
- Rotate
- Scale
- Skew
I will explain some of these transformations in the following sections.
Translate Transformation
The JavaFX Translate Transformation will "move" a JavaFX Node from its pre-transformation position to a new position. You can translate a JavaFX Node along either the Y or X axis. The amount you translate the Node along these axes is the distance it is moved. Here is an example of translating a JavaFX ImageView :
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class TranslateTransformationExample extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
ImageView imageViewOriginal = createImageView();
ImageView imageViewTranslated = createImageView();
Translate translateTransform = new Translate();
translateTransform.setX(200);
translateTransform.setY(100);
imageViewTranslated.getTransforms().add(translateTransform);
Pane pane = new Pane();
pane.getChildren().add(imageViewTranslated);
pane.getChildren().add(imageViewOriginal);
Scene scene = new Scene(pane, 1024, 800, true);
primaryStage.setScene(scene);
primaryStage.setTitle("2D Example");
primaryStage.show();
}
private ImageView createImageView() {
FileInputStream input = null;
try {
input = new FileInputStream("assets/media/abstract-5719221_640.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Image image = new Image(input);
ImageView imageView = new ImageView(image);
return imageView;
}
}
This example shows 2 ImageView nodes with a pre-transformation position of 0,0 - meaning on top of each other. After the translation you can see the translated ImageView under the non-transformed ImageView. The resulting app will look similar to this:
Rotate Transformation
The JavaFX Rotate Transformation rotates a JavaFX Node around a pivot point. Here is a JavaFX rotate transformation example showing a rotated and a non-rotated ImageView:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class RotateTransformationExample extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
ImageView imageViewOriginal = createImageView();
ImageView imageViewTranslated = createImageView();
Rotate rotateTransform = new Rotate();
rotateTransform.setAngle(45);
rotateTransform.setPivotX(0);
rotateTransform.setPivotY(0);
imageViewTranslated.getTransforms().add(rotateTransform);
Pane pane = new Pane();
pane.getChildren().add(imageViewTranslated);
pane.getChildren().add(imageViewOriginal);
Scene scene = new Scene(pane, 1024, 800, true);
primaryStage.setScene(scene);
primaryStage.setTitle("2D Example");
primaryStage.show();
}
private ImageView createImageView() {
FileInputStream input = null;
try {
input = new FileInputStream("assets/media/abstract-5719221_640.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Image image = new Image(input);
ImageView imageView = new ImageView(image);
return imageView;
}
}
This is how the resulting app will look like:
Scale Transformation
The JavaFX Scale Transformation scales a JavaFX Node up or down compared to its natural size. A scale of 1.0 is the same as the natural size. A scale below 1.0 is smaller than the natural size. A scale above 1.0 is larger than the natural size. For instance, a scale of 0.5 horizontally means a scale to half of the natural size. A scale of 2.0 means a scale to double the size. Here is a JavaFX scale transformation example showing a JavaFX ImageView that is scaled up to 1.5 it's original size horizontally (X-axis), and scaled down to 0.5 its original size vertically (Y-axis):
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ScaleTransformationExample extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
ImageView imageViewOriginal = createImageView();
ImageView imageViewScaled = createImageView();
Scale scaleTransformation = new Scale();
scaleTransformation.setX(1.5);
scaleTransformation.setY(0.5);
scaleTransformation.setPivotX(0);
scaleTransformation.setPivotY(0);
imageViewScaled.getTransforms().add(scaleTransformation);
Pane pane = new Pane();
pane.getChildren().add(imageViewScaled);
pane.getChildren().add(imageViewOriginal);
Scene scene = new Scene(pane, 1024, 800, true);
primaryStage.setScene(scene);
primaryStage.setTitle("2D Example");
primaryStage.show();
}
private ImageView createImageView() {
FileInputStream input = null;
try {
input = new FileInputStream("assets/media/abstract-5719221_640.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Image image = new Image(input);
ImageView imageView = new ImageView(image);
return imageView;
}
}
The resulting JavaFX app will look somewhat like this: