import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javafx.application.Application; import javafx.application.Platform; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.CircleBuilder; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.scene.shape.PathBuilder; import javafx.scene.shape.Rectangle; import javafx.scene.shape.RectangleBuilder; import javafx.scene.text.Text; import javafx.scene.text.TextBuilder; import javafx.stage.Stage; import javafx.stage.WindowEvent; public class ShapeEditor extends Application { protected ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 1); public static void main(String[] args) { launch(args); } public void start(final Stage primaryStage) throws Exception { final Group pane = new Group(); pane.translateXProperty().set(50); pane.translateYProperty().set(50); Scene scene = new Scene(pane); scene.setFill(Color.BLACK); primaryStage.setScene(scene); primaryStage.setWidth(550); primaryStage.setHeight(550); primaryStage.setX(0); primaryStage.setY(0); primaryStage.setTitle("C3 Shape Editor"); primaryStage.show(); final Path axis = PathBuilder .create() .elements(new MoveTo(0, 0), new LineTo(0, 100), new LineTo(-10, 90), new MoveTo(0, 100), new LineTo(10, 90), new MoveTo(0, 100), new LineTo(0, 3000), new MoveTo(0, 0), new LineTo(100, 0), new LineTo(90, -10), new MoveTo(100, 0), new LineTo(90, 10), new MoveTo(100, 0), new LineTo(3000, 0)).stroke(Color.WHITE).build(); final Text origin = TextBuilder.create().text("(0,0)") .fill(Color.WHITE).x(-10).y(-5).build(); final Text x = TextBuilder.create().text("X Axis").fill(Color.WHITE) .x(50).y(-5).build(); final Text y = TextBuilder.create().text("Y Axis").fill(Color.WHITE) .x(-25).y(70).rotate(-90).build(); this.executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { Platform.runLater(new Runnable() { @Override public void run() { pane.getChildren().clear(); Node dut = createShape(); pane.getChildren().addAll(dut, axis, origin, x, y); } }); } }, 200, 200, TimeUnit.MILLISECONDS); primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent paramT) { executor.shutdownNow(); } }); } public Node createShape() { Rectangle rectangle = RectangleBuilder.create().x(50).y(100).width(250) .height(100).fill(Color.RED).stroke(Color.BLACK).build(); Circle circle = CircleBuilder.create().centerX(150).centerY(100) .fill(Color.BLUE).radius(200).build(); return new Group(circle, rectangle); } }