diff --git a/core/src/processing/javafx/PSurfaceFX.java b/core/src/processing/javafx/PSurfaceFX.java index 29fa59861..9cd5baa11 100644 --- a/core/src/processing/javafx/PSurfaceFX.java +++ b/core/src/processing/javafx/PSurfaceFX.java @@ -25,7 +25,10 @@ package processing.javafx; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; +import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javafx.animation.Animation; @@ -38,9 +41,14 @@ import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.event.EventType; +import javafx.scene.Cursor; +import javafx.scene.ImageCursor; import javafx.scene.Scene; import javafx.scene.SceneAntialiasing; import javafx.scene.canvas.Canvas; +import javafx.scene.image.Image; +import javafx.scene.image.PixelFormat; +import javafx.scene.image.WritableImage; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; @@ -329,6 +337,11 @@ public class PSurfaceFX implements PSurface { // the stage, assign it only when it is all set up surface.stage = stage; } + + @Override + public void stop() throws Exception { + surface.sketch.dispose(); + } } @@ -352,6 +365,8 @@ public class PSurfaceFX implements PSurface { Thread.sleep(5); } catch (InterruptedException e) { } } + + setProcessingIcon(stage); } @@ -390,7 +405,42 @@ public class PSurfaceFX implements PSurface { public void setIcon(PImage icon) { - // TODO implement this in JavaFX + int w = icon.pixelWidth; + int h = icon.pixelHeight; + WritableImage im = new WritableImage(w, h); + im.getPixelWriter().setPixels(0, 0, w, h, + PixelFormat.getIntArgbInstance(), + icon.pixels, + 0, w); + + Stage stage = (Stage) canvas.getScene().getWindow(); + stage.getIcons().clear(); + stage.getIcons().add(im); + } + + + List iconImages; + + protected void setProcessingIcon(Stage stage) { + // Adapted from PSurfaceAWT + // Note: FX chooses wrong icon size, should be fixed in Java 9, see: + // https://bugs.openjdk.java.net/browse/JDK-8091186 + // Removing smaller sizes helps a bit, but big ones are downsized + try { + if (iconImages == null) { + iconImages = new ArrayList<>(); + final int[] sizes = { 48, 64, 128, 256, 512 }; + + for (int sz : sizes) { + URL url = PApplet.class.getResource("/icon/icon-" + sz + ".png"); + Image image = new Image(url.toString()); + iconImages.add(image); + } + } + List icons = stage.getIcons(); + icons.clear(); + icons.addAll(iconImages); + } catch (Exception e) { } // harmless; keep this to ourselves } @@ -590,28 +640,45 @@ public class PSurfaceFX implements PSurface { // canvas.requestFocus(); // } + Cursor lastCursor = Cursor.DEFAULT; public void setCursor(int kind) { - // TODO Auto-generated method stub - + Cursor c; + switch (kind) { + case PConstants.ARROW: c = Cursor.DEFAULT; break; + case PConstants.CROSS: c = Cursor.CROSSHAIR; break; + case PConstants.HAND: c = Cursor.HAND; break; + case PConstants.MOVE: c = Cursor.MOVE; break; + case PConstants.TEXT: c = Cursor.TEXT; break; + case PConstants.WAIT: c = Cursor.WAIT; break; + default: c = Cursor.DEFAULT; break; + } + lastCursor = c; + canvas.getScene().setCursor(c); } public void setCursor(PImage image, int hotspotX, int hotspotY) { - // TODO Auto-generated method stub - + int w = image.pixelWidth; + int h = image.pixelHeight; + WritableImage im = new WritableImage(w, h); + im.getPixelWriter().setPixels(0, 0, w, h, + PixelFormat.getIntArgbInstance(), + image.pixels, + 0, w); + ImageCursor c = new ImageCursor(im, hotspotX, hotspotY); + lastCursor = c; + canvas.getScene().setCursor(c); } public void showCursor() { - // TODO Auto-generated method stub - + canvas.getScene().setCursor(lastCursor); } public void hideCursor() { - // TODO Auto-generated method stub - + canvas.getScene().setCursor(Cursor.NONE); }