fork download
  1. import javafx.application.Application;
  2. import javafx.application.Platform;
  3. import javafx.concurrent.Task;
  4. import javafx.geometry.Point2D;
  5. import javafx.scene.Scene;
  6. import javafx.scene.canvas.Canvas;
  7. import javafx.scene.canvas.GraphicsContext;
  8. import javafx.scene.image.WritableImage;
  9. import javafx.scene.layout.StackPane;
  10. import javafx.stage.Stage;
  11.  
  12. /**
  13.  * @see https://stackoverflow.com/a/44056730/230513
  14.  */
  15. public class CanvasTaskTest extends Application {
  16.  
  17. private static final int PANEL_WIDTH =600, PANEL_HEIGHT = 600;
  18. private static final int TRI_WIDTH= 500, TRI_HEIGHT= 500;
  19. private static final int SIDE_GAP = (PANEL_WIDTH - TRI_WIDTH)/2;
  20. private static final int TOP_GAP = (PANEL_HEIGHT - TRI_HEIGHT)/2;
  21. private Canvas canvas;
  22.  
  23. private long startTime;
  24. private int countTriangles;
  25. private static int numberOfLevels = 13;
  26.  
  27. @Override
  28. public void start(Stage stage) {
  29.  
  30. stage.setTitle("CanvasTaskTest");
  31. StackPane root = new StackPane();
  32. canvas = new Canvas(PANEL_WIDTH, PANEL_HEIGHT);
  33. root.getChildren().add(canvas);
  34. Scene scene = new Scene(root);
  35. stage.setScene(scene);
  36. stage.show();
  37. CanvasTask task = new CanvasTask();
  38. Thread thread = new Thread(task);
  39. thread.setDaemon(true);
  40. thread.start();
  41. }
  42.  
  43. private void updateGraphics(boolean success, Canvas backgroundCanvas){
  44.  
  45. if(success) {
  46.  
  47. copyCanvas(backgroundCanvas);
  48.  
  49. GraphicsContext gc = canvas.getGraphicsContext2D();
  50. gc.fillText("Number of triangles: "+ countTriangles,5,15);
  51. gc.fillText("Time: "+ (System.currentTimeMillis()- startTime )+ " mili seconds", 5,35);
  52. gc.fillText("Levels: "+ numberOfLevels,5,55);
  53. }else {
  54.  
  55. GraphicsContext gc = canvas.getGraphicsContext2D();
  56. gc.clearRect(0, 0, PANEL_WIDTH, PANEL_HEIGHT);
  57. gc.fillText("Failed ",5,15);
  58. }
  59. }
  60.  
  61. private void copyCanvas(Canvas backgroundCanvas) {
  62.  
  63. WritableImage image = backgroundCanvas.snapshot(null, null);
  64. canvas.getGraphicsContext2D().drawImage(image, 0, 0);
  65. }
  66.  
  67. private class CanvasTask extends Task<Void> {
  68.  
  69. private Point2D top, left, right;
  70. private Canvas backgroundCanvas;
  71.  
  72. private GraphicsContext gc;
  73.  
  74. @Override
  75. protected Void call() throws Exception {
  76.  
  77. backgroundCanvas = new Canvas(PANEL_WIDTH, PANEL_HEIGHT);
  78. gc = backgroundCanvas.getGraphicsContext2D();
  79. countTriangles = 0;
  80. setStartPoints();
  81. startTime = System.currentTimeMillis();
  82.  
  83. Platform.runLater(new Runnable() {
  84.  
  85. @Override
  86. public void run() {
  87. drawTriangle(numberOfLevels, top, left, right);
  88. }
  89. });
  90.  
  91. return null;
  92. }
  93.  
  94. @Override
  95. protected void succeeded() {
  96.  
  97. updateGraphics(true, backgroundCanvas);
  98. super.succeeded();
  99. }
  100.  
  101. @Override
  102. protected void failed() {
  103.  
  104. updateGraphics(false, null);
  105. }
  106.  
  107. private void drawTriangle( int levels,
  108. Point2D top, Point2D left, Point2D right) {
  109.  
  110. if(levels < 0) {//add stop criteria
  111. return ;
  112. }
  113.  
  114. gc.strokePolygon( //implementing with strokeLine did not make much difference
  115. new double[]{
  116. top.getX(),left.getX(),right.getX()
  117. },
  118. new double[]{
  119. top.getY(),left.getY(), right.getY()
  120. },
  121. 3);
  122.  
  123. countTriangles++;
  124.  
  125. //Get the midpoint on each edge in the triangle
  126. Point2D p12 = midpoint(top, left);
  127. Point2D p23 = midpoint(left, right);
  128. Point2D p31 = midpoint(right, top);
  129.  
  130. // recurse on 3 triangular areas
  131. drawTriangle(levels - 1, top, p12, p31);
  132. drawTriangle(levels - 1, p12, left, p23);
  133. drawTriangle(levels - 1, p31, p23, right);
  134. }
  135.  
  136. private void setStartPoints() {
  137.  
  138. top = new Point2D(PANEL_WIDTH/2, TOP_GAP);
  139. left = new Point2D(SIDE_GAP, TOP_GAP + TRI_HEIGHT);
  140. right = new Point2D(SIDE_GAP + TRI_WIDTH, TOP_GAP + TRI_WIDTH);
  141. }
  142.  
  143. private Point2D midpoint(Point2D p1, Point2D p2) {
  144.  
  145. return new Point2D((p1.getX() + p2.getX()) /
  146. 2, (p1.getY() + p2.getY()) / 2);
  147. }
  148. }
  149.  
  150. public static void main(String[] args) {
  151. launch(args);
  152. }
  153. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:17: error: class CanvasTaskTest is public, should be declared in a file named CanvasTaskTest.java
public class CanvasTaskTest extends Application {
       ^
Main.java:2: error: package javafx.application does not exist
import javafx.application.Application;
                         ^
Main.java:3: error: package javafx.application does not exist
import javafx.application.Platform;
                         ^
Main.java:4: error: package javafx.beans.value does not exist
import javafx.beans.value.ObservableValue;
                         ^
Main.java:5: error: package javafx.concurrent does not exist
import javafx.concurrent.Task;
                        ^
Main.java:6: error: package javafx.geometry does not exist
import javafx.geometry.Point2D;
                      ^
Main.java:7: error: package javafx.scene does not exist
import javafx.scene.Scene;
                   ^
Main.java:8: error: package javafx.scene.canvas does not exist
import javafx.scene.canvas.Canvas;
                          ^
Main.java:9: error: package javafx.scene.canvas does not exist
import javafx.scene.canvas.GraphicsContext;
                          ^
Main.java:10: error: package javafx.scene.image does not exist
import javafx.scene.image.WritableImage;
                         ^
Main.java:11: error: package javafx.scene.layout does not exist
import javafx.scene.layout.StackPane;
                          ^
Main.java:12: error: package javafx.stage does not exist
import javafx.stage.Stage;
                   ^
Main.java:17: error: cannot find symbol
public class CanvasTaskTest extends Application {
                                    ^
  symbol: class Application
Main.java:23: error: cannot find symbol
	private Canvas canvas;
	        ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:30: error: cannot find symbol
	public void start(Stage stage) {
	                  ^
  symbol:   class Stage
  location: class CanvasTaskTest
Main.java:50: error: cannot find symbol
	private void updateGraphics(boolean success, Canvas backgroundCanvas){
	                                             ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:68: error: cannot find symbol
	private void copyCanvas(Canvas backgroundCanvas) {
	                        ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:74: error: cannot find symbol
	private class CanvasTask extends Task<Canvas> {
	                                 ^
  symbol:   class Task
  location: class CanvasTaskTest
Main.java:74: error: cannot find symbol
	private class CanvasTask extends Task<Canvas> {
	                                      ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:76: error: cannot find symbol
		private Point2D top, left, right;
		        ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:77: error: cannot find symbol
		private Canvas backgroundCanvas;
		        ^
  symbol:   class Canvas
  location: class CanvasTaskTest.CanvasTask
Main.java:79: error: cannot find symbol
		private GraphicsContext gc;
		        ^
  symbol:   class GraphicsContext
  location: class CanvasTaskTest.CanvasTask
Main.java:82: error: cannot find symbol
		protected Canvas call() throws Exception {
		          ^
  symbol:   class Canvas
  location: class CanvasTaskTest.CanvasTask
Main.java:115: error: cannot find symbol
				Point2D top, Point2D left, Point2D right) {
				^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:115: error: cannot find symbol
				Point2D top, Point2D left, Point2D right) {
				             ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:115: error: cannot find symbol
				Point2D top, Point2D left, Point2D right) {
				                           ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:150: error: cannot find symbol
		private Point2D midpoint(Point2D p1, Point2D p2) {
		                         ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:150: error: cannot find symbol
		private Point2D midpoint(Point2D p1, Point2D p2) {
		                                     ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:150: error: cannot find symbol
		private Point2D midpoint(Point2D p1, Point2D p2) {
		        ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:29: error: method does not override or implement a method from a supertype
	@Override
	^
Main.java:33: error: cannot find symbol
		StackPane root = new StackPane();
		^
  symbol:   class StackPane
  location: class CanvasTaskTest
Main.java:33: error: cannot find symbol
		StackPane root = new StackPane();
		                     ^
  symbol:   class StackPane
  location: class CanvasTaskTest
Main.java:34: error: cannot find symbol
		canvas = new Canvas(PANEL_WIDTH, PANEL_HEIGHT);
		             ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:36: error: cannot find symbol
		Scene scene = new Scene(root);
		^
  symbol:   class Scene
  location: class CanvasTaskTest
Main.java:36: error: cannot find symbol
		Scene scene = new Scene(root);
		                  ^
  symbol:   class Scene
  location: class CanvasTaskTest
Main.java:40: error: cannot find symbol
		task.valueProperty().addListener((ObservableValue
		    ^
  symbol:   method valueProperty()
  location: variable task of type CanvasTaskTest.CanvasTask
Main.java:40: error: cannot find symbol
		task.valueProperty().addListener((ObservableValue
		                                  ^
  symbol:   class ObservableValue
  location: class CanvasTaskTest
Main.java:41: error: cannot find symbol
				<? extends Canvas> observable, Canvas oldValue, Canvas newValue) -> {
				           ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:41: error: cannot find symbol
				<? extends Canvas> observable, Canvas oldValue, Canvas newValue) -> {
				                               ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:41: error: cannot find symbol
				<? extends Canvas> observable, Canvas oldValue, Canvas newValue) -> {
				                                                ^
  symbol:   class Canvas
  location: class CanvasTaskTest
Main.java:45: error: no suitable constructor found for Thread(CanvasTaskTest.CanvasTask)
		Thread thread = new Thread(task);
		                ^
    constructor Thread.Thread(Runnable) is not applicable
      (argument mismatch; CanvasTaskTest.CanvasTask cannot be converted to Runnable)
    constructor Thread.Thread(String) is not applicable
      (argument mismatch; CanvasTaskTest.CanvasTask cannot be converted to String)
Main.java:56: error: cannot find symbol
			GraphicsContext gc = canvas.getGraphicsContext2D();
			^
  symbol:   class GraphicsContext
  location: class CanvasTaskTest
Main.java:62: error: cannot find symbol
			GraphicsContext gc = canvas.getGraphicsContext2D();
			^
  symbol:   class GraphicsContext
  location: class CanvasTaskTest
Main.java:70: error: cannot find symbol
		WritableImage image = backgroundCanvas.snapshot(null, null);
		^
  symbol:   class WritableImage
  location: class CanvasTaskTest
Main.java:81: error: method does not override or implement a method from a supertype
		@Override
		^
Main.java:84: error: cannot find symbol
			backgroundCanvas = new Canvas(PANEL_WIDTH, PANEL_HEIGHT);
			                       ^
  symbol:   class Canvas
  location: class CanvasTaskTest.CanvasTask
Main.java:90: error: cannot find symbol
			Platform.runLater(new Runnable() {
			^
  symbol:   variable Platform
  location: class CanvasTaskTest.CanvasTask
Main.java:101: error: method does not override or implement a method from a supertype
		@Override
		^
Main.java:105: error: cannot find symbol
			super.succeeded();
			^
  symbol:   variable super
  location: class CanvasTaskTest.CanvasTask
Main.java:108: error: method does not override or implement a method from a supertype
		@Override
		^
Main.java:133: error: cannot find symbol
			Point2D p12 = midpoint(top, left);
			^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:134: error: cannot find symbol
			Point2D p23 = midpoint(left, right);
			^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:135: error: cannot find symbol
			Point2D p31 = midpoint(right, top);
			^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:145: error: cannot find symbol
			top = new Point2D(PANEL_WIDTH/2, TOP_GAP);
			          ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:146: error: cannot find symbol
			left = new Point2D(SIDE_GAP, TOP_GAP + TRI_HEIGHT);
			           ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:147: error: cannot find symbol
			right = new Point2D(SIDE_GAP + TRI_WIDTH, TOP_GAP + TRI_WIDTH);
			            ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:152: error: cannot find symbol
			return new Point2D((p1.getX() + p2.getX()) /
			           ^
  symbol:   class Point2D
  location: class CanvasTaskTest.CanvasTask
Main.java:158: error: cannot find symbol
		launch(args);
		^
  symbol:   method launch(String[])
  location: class CanvasTaskTest
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
58 errors
stdout
Standard output is empty