{"id":2562,"date":"2013-12-05T12:48:25","date_gmt":"2013-12-05T10:48:25","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2562"},"modified":"2013-12-05T13:11:08","modified_gmt":"2013-12-05T11:11:08","slug":"javafx-put-a-draggable-resizable-polygon-on-an-image","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/12\/javafx-put-a-draggable-resizable-polygon-on-an-image\/","title":{"rendered":"JavaFX: Put a draggable, resizable polygon on an image"},"content":{"rendered":"<pre>import java.util.concurrent.atomic.AtomicInteger;\nimport javafx.application.Application;\nimport javafx.beans.value.ChangeListener;\nimport javafx.beans.value.ObservableValue;\nimport javafx.event.EventHandler;\nimport javafx.scene.Cursor;\nimport javafx.scene.Scene;\nimport javafx.scene.image.Image;\nimport javafx.scene.image.ImageView;\nimport javafx.scene.input.MouseEvent;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Circle;\nimport javafx.scene.shape.Polygon;\nimport javafx.stage.Stage;\n\nclass DrawingPane extends Pane\n{\n  public DrawingPane( Image image, Polygon poly )\n  {\n    poly.setFill( Color.web( &quot;ANTIQUEWHITE&quot;, 0.8 ) );\n    poly.setStroke( Color.web( &quot;ANTIQUEWHITE&quot; ) );\n    poly.setStrokeWidth( 2 );\n\n    getChildren().addAll( new ImageView( image ), poly );\n\n    for ( int i = 0; i &lt; poly.getPoints().size(); i += 2 ) {\n      Circle circle = new Circle( poly.getPoints().get( i ), poly.getPoints().get( i + 1 ), 5 );\n      circle.setFill( Color.web( &quot;PERU&quot;, 0.8 ) );\n      circle.setStroke( Color.PERU );\n      circle.setStrokeWidth( 2 );\n\n      AtomicInteger polyCoordinateIndex = new AtomicInteger( i );\n      circle.centerXProperty().addListener( new ChangeListener&lt;Number&gt;() {\n        @Override\n        public void changed( ObservableValue&lt;? extends Number&gt; observable, Number oldValue, Number newValue ) {\n          poly.getPoints().set( polyCoordinateIndex.get(), newValue.doubleValue() );\n        }\n      } );\n      circle.centerYProperty().addListener( new ChangeListener&lt;Number&gt;() {\n        @Override\n        public void changed( ObservableValue&lt;? extends Number&gt; observable, Number oldValue, Number newValue ) {\n          poly.getPoints().set( polyCoordinateIndex.get() + 1, (Double) newValue );\n        }\n      } );\n      setDragHandler( circle );\n      getChildren().add( circle );\n    }\n  }\n\n  private double dragDeltaX, dragDeltaY; \n\n  private void setDragHandler( Circle circle )\n  {\n    circle.setOnMousePressed( new EventHandler&lt;MouseEvent&gt;() {\n      @Override public void handle( MouseEvent mouseEvent ) {\n        dragDeltaX = circle.getCenterX() - mouseEvent.getSceneX();\n        dragDeltaY = circle.getCenterY() - mouseEvent.getSceneY();\n      }\n    } );\n\n    circle.setOnMouseDragged( new EventHandler&lt;MouseEvent&gt;() {\n      @Override public void handle( MouseEvent mouseEvent ) {\n        circle.setCenterX( mouseEvent.getSceneX() + dragDeltaX );\n        circle.setCenterY( mouseEvent.getSceneY() + dragDeltaY );\n        circle.setCursor( Cursor.MOVE );\n      }\n    } );\n\n    circle.setOnMouseEntered( new EventHandler&lt;MouseEvent&gt;() {\n      @Override public void handle( MouseEvent mouseEvent ) {\n        circle.setCursor( Cursor.HAND );\n      }\n    } );\n\n    circle.setOnMouseReleased( new EventHandler&lt;MouseEvent&gt;() {\n      @Override public void handle( MouseEvent mouseEvent ) {\n        circle.setCursor( Cursor.HAND );\n      }\n    } );\n  }\n}\n\npublic class JavafxDemo extends Application\n{\n  @Override\n  public void start( Stage stage )\n  {\n    Image image = new Image( &quot;http:\/\/tours-tv.com\/uploads\/maps\/map-Medizinische-Hochschule-Hannover-karta.jpg&quot; );\n    Polygon poly = new Polygon( 10, 10, 100, 10, 200, 100, 50, 200 );\n\n    stage.setScene( new Scene( new DrawingPane( image, poly ), 450, 300 ) );\n    stage.show();\n  }\n\n  public static void main( String[] args )\n  {\n    launch( args );\n  }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>import java.util.concurrent.atomic.AtomicInteger; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.scene.Cursor; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Polygon; import javafx.stage.Stage; class DrawingPane extends Pane { public DrawingPane( Image image, Polygon poly ) { poly.setFill( Color.web( &quot;ANTIQUEWHITE&quot;, 0.8 ) ); poly.setStroke( Color.web( &quot;ANTIQUEWHITE&quot; ) ); poly.setStrokeWidth( [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[62],"tags":[],"class_list":["post-2562","post","type-post","status-publish","format-standard","hentry","category-javafx"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2562"}],"version-history":[{"count":5,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2562\/revisions"}],"predecessor-version":[{"id":2567,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2562\/revisions\/2567"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}