Added an animating Steam Punk gear to the mix. The project can be downloaded at https://docs.google.com/open?id=0B9yySVFbRABBYTM5MmYwOTctNWE0ZS00MTExLWJhOTktYzQ2OTVmZTYzNzcx.
package thepipehouse;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.Reflection;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
*
* @author awelle
*/
public class ThePipeHouse extends Application {
Timeline timeline;
private void init(Stage primaryStage) {
primaryStage.setTitle(“JavaFX The Pipe House”);
Group root = new Group();
Scene primaryScene = new Scene(root, 600, 800, Color.WHITE);
ImageView backgroundView = new ImageView();
Image backgroundImage = new Image(“C:/NetbeansImages/ThePipeHouseLime.png”);
backgroundView.setImage(backgroundImage);
final Circle circleFast = new Circle(24, 24, 24, Color.web(“#875a2a”));
circleFast.setCenterX(90d);
Reflection r = new Reflection();
r.setFraction(5.0);
circleFast.setEffect(r);
final Circle circleFaster = new Circle(24, 24, 24, Color.web(“#875a2a”));
circleFaster.setCenterX(60d);
circleFaster.setEffect(r);
final Circle circleFastest = new Circle(24, 24, 24, Color.web(“#875a2a”));
circleFastest.setCenterX(30d);
circleFastest.setEffect(r);
SteamPunkGear steamPunkGear = new SteamPunkGear(20f, 60f, 6.0f, 20, 0.7f, 520, 700);
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
timeline.getKeyFrames().addAll(
new KeyFrame(Duration.ZERO,
new KeyValue(circleFast.translateXProperty(), 0)),
new KeyFrame(new Duration(4000),
new KeyValue(circleFast.translateYProperty(), 700)),
new KeyFrame(Duration.ZERO,
new KeyValue(circleFaster.translateXProperty(), 0)),
new KeyFrame(new Duration(3500),
new KeyValue(circleFaster.translateYProperty(), 700)),
new KeyFrame(Duration.ZERO,
new KeyValue(circleFastest.translateXProperty(), 0)),
new KeyFrame(new Duration(3000),
new KeyValue(circleFastest.translateYProperty(), 700)),
new KeyFrame(Duration.ZERO,
new KeyValue(steamPunkGear.rotateProperty(),0)),
new KeyFrame(new Duration(3000),
new KeyValue(steamPunkGear.rotateProperty(),700)));
Button buttonStart = new Button(“Start”);
buttonStart.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
timeline.play();
}
});
Button buttonStop = new Button(“Stop”);
buttonStop.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
timeline.stop();
}
});
HBox hbox = new HBox();
hbox.setPadding(new Insets(0, 10, 10, 10));
hbox.setSpacing(10);
hbox.getChildren().addAll(buttonStart, buttonStop);
BorderPane borderLayout = new BorderPane();
borderLayout.setTop(new Rectangle(600, 50, Color.TRANSPARENT));
borderLayout.setCenter(new Rectangle(500, 700, Color.TRANSPARENT));
borderLayout.setLeft(reflection());
borderLayout.setBottom(hbox);
VBox layout = new VBox();
layout.getChildren().addAll(backgroundView);
root.getChildren().addAll(layout, borderLayout, circleFast, circleFaster, circleFastest, steamPunkGear);
primaryStage.setScene(primaryScene);
primaryStage.show();
}
static Node reflection() {
Text t = new Text();
t.setX(0.0f);
t.setY(0.0f);
t.setCache(true);
t.setText(“The Pipe House”);
t.setFill(Color.YELLOWGREEN);
t.setFont(Font.font(“null”, FontWeight.BOLD, 34));
t.setRotate(270d);
Reflection r = new Reflection();
r.setFraction(5.0);
t.setEffect(r);
t.setTranslateX(-100);
t.setTranslateY(240);
return t;
}
private class SteamPunkGear extends Parent {
private final float innerRadius;
private final float outerRadius;
private final float width;
private final int numOfTeeth;
private final float toothDepth;
private final double centerX;
private final double centerY;
public SteamPunkGear(float innerRadius, float outerRadius, float width, int numOfTeeth, float toothDepth, double centerX, double centerY) {
this.innerRadius = innerRadius;
this.outerRadius = outerRadius;
this.width = width;
this.numOfTeeth = numOfTeeth;
this.toothDepth = toothDepth;
this.centerX = centerX;
this.centerY = centerY;
getChildren().addAll(createGearTeeth());
}
private Group createGearTeeth() {
Group group = new Group();
Circle baseGearCircle = new Circle();
baseGearCircle.setRadius(outerRadius – 5);
baseGearCircle.setFill(Color.web(“#875a2a”));
baseGearCircle.setStroke(Color.web(“#875a2a”));
baseGearCircle.setStrokeWidth(width);
Circle centerCircle = new Circle();
centerCircle.setRadius(innerRadius – 12);
centerCircle.setFill(Color.WHITE);
Circle innerCircle1 = new Circle();
innerCircle1.setRadius(innerRadius – 2);
innerCircle1.setFill(Color.WHITE);
innerCircle1.setTranslateX(22);
innerCircle1.setTranslateY(20);
Circle innerCircle2 = new Circle();
innerCircle2.setRadius(innerRadius – 2);
innerCircle2.setFill(Color.WHITE);
innerCircle2.setTranslateX(-22);
innerCircle2.setTranslateY(20);
Circle innerCircle3 = new Circle();
innerCircle3.setRadius(innerRadius – 2);
innerCircle3.setFill(Color.WHITE);
innerCircle3.setTranslateX(22);
innerCircle3.setTranslateY(-20);
Circle innerCircle4 = new Circle();
innerCircle4.setRadius(innerRadius – 2);
innerCircle4.setFill(Color.WHITE);
innerCircle4.setTranslateX(-22);
innerCircle4.setTranslateY(-20);
for (int i = 0; i < numOfTeeth; i++) {
double angle = (360 / numOfTeeth) * (i);
group.getChildren().add(createTooth(angle, width));
}
group.getChildren().addAll(baseGearCircle, innerCircle1, innerCircle2, innerCircle3, innerCircle4, centerCircle);
group.setLayoutX(centerX);
group.setLayoutY(centerY);
return group;
}
private Rectangle createTooth(double angle, double width) {
Rectangle tooth = new Rectangle(-width / 2, -width / 2, width, width);
tooth.setFill(Color.web(“#875a2a”));
tooth.setRotate(angle);
tooth.setLayoutX(outerRadius * Math.cos(Math.toRadians(angle)));
tooth.setLayoutY(outerRadius * Math.sin(Math.toRadians(angle)));
return tooth;
}
}
@Override
public void stop() {
timeline.stop();
}
@Override
public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

