import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.stage.Stage; public class TestBufferClear extends Application { Canvas c; GraphicsContext gc; double curx, cury; static boolean intermediate = true; public void start(Stage stage) { c = new Canvas(500, 500); curx = 250; cury = 250; draw(curx, cury); Scene scene = new Scene(new Group(c)); scene.addEventHandler(MouseEvent.MOUSE_DRAGGED, new EventHandler() { public void handle(MouseEvent event) { double prevx = curx; double prevy = cury; double nextx = event.getSceneX(); double nexty = event.getSceneY(); double dx = nextx - prevx; double dy = nexty - prevy; double numsteps = Math.ceil(Math.max(Math.abs(dx), Math.abs(dy))); dx /= numsteps; dy /= numsteps; if (intermediate) { for (int i = 1; i < numsteps; i++) { prevx += dx; prevy += dy; draw(prevx, prevy); } } draw(nextx, nexty); curx = nextx; cury = nexty; } }); stage.setScene(scene); stage.setTitle(intermediate ? "Rendering on every intermediate pixel" : "Rendering only at mouse coordinates"); stage.show(); } public void draw(double x, double y) { gc = c.getGraphicsContext2D(); gc.setFill(Color.WHITE); gc.fillRect(0, 0, 500, 500); gc.setStroke(Color.BLUE); gc.stroke(); gc.beginPath(); gc.moveTo(x, y); for (int i = 0; i < 500; i++) { double dx = Math.random() * 50 - 25; double dy = Math.random() * 50 - 25; gc.lineTo(x + dx, y + dy); } gc.setStroke(Color.GREEN); gc.stroke(); } public static void main(String argv[]) { intermediate = (argv.length == 0); launch(argv); } }