package jfxfeatures.graphics.shapes.paths.performance; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.ScrollEvent; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Line; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.stage.Stage; public class TestRandomPathFX extends Application { //############################### change configuration here private static int numberLines = 10_000; private static boolean usePath = true; private static boolean useOffset = false; private static boolean limitScale = true; //######################################################### private float scale; private float coordMinX; private float coordMaxX; private float coordMinY; private float coordMaxY; Pane pane; Group graphRoot; public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { stage.setTitle("TestRandomPathFX"); pane = new Pane(); graphRoot = new Group(); graphRoot.setManaged(false); pane.getChildren().add(graphRoot); final Scene scene = new Scene(pane, 800, 800, Color.WHITE); addMouseHandler(); stage.setScene(scene); stage.show(); scale=1; coordMinX = 100; coordMaxX = 700; coordMinY = 100; coordMaxY = 700; makeRandom(); zoom(); } private void addMouseHandler() { pane.addEventHandler(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() { @Override public void handle(ScrollEvent e) { double val = e.getDeltaY(); if (val < 0) { // Opposite to Swing version scale *= 0.9; } else { scale *= 1.1; } if (limitScale) { scale = Math.min(1.0f, scale); } zoom(); } }); } private void makeRandom() { long t0 = System.currentTimeMillis(); float pXstart; float pYstart; float pXend; float pYend; Path path = null; for (int i = 0; i < numberLines; i++) { pXstart = coordMinX + (float) Math.random() * ((coordMaxX - coordMinX) + 1); pYstart = coordMinY + (float) (Math.random() * ((coordMaxY - coordMinY) + 1)); pXend = coordMinX + (float) (Math.random() * ((coordMaxX - coordMinX) + 1)); pYend = coordMinY + (float) (Math.random() * ((coordMaxY - coordMinY) + 1)); if (usePath) { // for Path use this code if (path == null) { path = new Path(); graphRoot.getChildren().add(path); } MoveTo start = new MoveTo(pXstart, pYstart); LineTo end = new LineTo(pXend, pYend); path.getElements().addAll(start, end); } else { // for Line use this code graphRoot.getChildren().add(new Line(pXstart, pYstart, pXend, pYend)); } } long t1 = System.currentTimeMillis(); if (usePath) { System.out.println("Creating path with " + numberLines + " lines took " + (t1-t0) + " ms."); } else { System.out.println("Creating " + numberLines + " lines took " + (t1-t0) + " ms."); } } private void zoom() { if (useOffset) { graphRoot.setTranslateX(200.0); graphRoot.setTranslateY(200.0); } graphRoot.setScaleX(scale); graphRoot.setScaleY(scale); } }