package jfxfeatures.graphics.shapes.paths.performance; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import javax.swing.JComponent; import javax.swing.JFrame; @SuppressWarnings("serial") public class TestRandomPathSwing { //############################### 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 static class PathRenderer extends JComponent implements MouseWheelListener { private float scale; private float coordMinX; private float coordMaxX; private float coordMinY; private float coordMaxY; Path2D.Float path = null; Line2D.Float[] lines = null; public PathRenderer() { addMouseWheelListener(this); setOpaque(true); scale=1; coordMinX = 100; coordMaxX = 700; coordMinY = 100; coordMaxY = 700; makeRandom(); } private void makeRandom() { long t0 = System.currentTimeMillis(); float pXstart; float pYstart; float pXend; float pYend; 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 Path2D.Float(); } path.moveTo(pXstart, pYstart); path.lineTo(pXend, pYend); } else { // for Line use this code if (lines == null) { lines = new Line2D.Float[numberLines]; } lines[i] = new Line2D.Float(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."); } } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setBackground(Color.WHITE); g2.clearRect(getX(), getX(), getWidth(), getHeight()); g2.setColor(Color.BLACK); if (useOffset) { g2.translate(200, 200); } double w2 = getWidth()/2; double h2 = getHeight()/2; g2.translate(w2-w2*scale, h2-h2*scale); g2.scale(scale, scale); if (path != null) { long t0 = System.currentTimeMillis(); g2.draw(path); long t1 = System.currentTimeMillis(); System.out.println("Rendering path with " + numberLines + " lines took " + (t1-t0) + " ms."); } if (lines != null) { long t0 = System.currentTimeMillis(); for (int i = 0; i < lines.length; ++i) { g2.draw(lines[i]); } long t1 = System.currentTimeMillis(); System.out.println("Rendering " + numberLines + " lines took " + (t1-t0) + " ms."); } } @Override public void mouseWheelMoved(MouseWheelEvent e) { float val = e.getWheelRotation(); if (val > 0) { scale *= 0.9; } else { scale *= 1.1; } if (limitScale) { scale = Math.min(1.0f, scale); } repaint(); } } private static void createAndShowGUI() { JFrame frame = new JFrame("TestRandomPathSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); PathRenderer pathRenderer = new PathRenderer(); pathRenderer.setPreferredSize(new Dimension(800, 800)); frame.getContentPane().add(pathRenderer, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }