|
25 | 25 | import java.awt.GraphicsDevice; |
26 | 26 | import java.awt.GraphicsEnvironment; |
27 | 27 | import java.awt.Rectangle; |
| 28 | +import java.net.URL; |
| 29 | +import java.util.ArrayList; |
28 | 30 | import java.util.HashMap; |
| 31 | +import java.util.List; |
29 | 32 | import java.util.Map; |
30 | 33 |
|
31 | 34 | import javafx.animation.Animation; |
|
43 | 46 | import javafx.scene.Scene; |
44 | 47 | import javafx.scene.SceneAntialiasing; |
45 | 48 | import javafx.scene.canvas.Canvas; |
| 49 | +import javafx.scene.image.Image; |
46 | 50 | import javafx.scene.image.PixelFormat; |
47 | 51 | import javafx.scene.image.WritableImage; |
48 | 52 | import javafx.scene.input.KeyCode; |
@@ -356,6 +360,8 @@ public void run() { |
356 | 360 | Thread.sleep(5); |
357 | 361 | } catch (InterruptedException e) { } |
358 | 362 | } |
| 363 | + |
| 364 | + setProcessingIcon(stage); |
359 | 365 | } |
360 | 366 |
|
361 | 367 |
|
@@ -394,7 +400,42 @@ public void setResizable(boolean resizable) { |
394 | 400 |
|
395 | 401 |
|
396 | 402 | public void setIcon(PImage icon) { |
397 | | - // TODO implement this in JavaFX |
| 403 | + int w = icon.pixelWidth; |
| 404 | + int h = icon.pixelHeight; |
| 405 | + WritableImage im = new WritableImage(w, h); |
| 406 | + im.getPixelWriter().setPixels(0, 0, w, h, |
| 407 | + PixelFormat.getIntArgbInstance(), |
| 408 | + icon.pixels, |
| 409 | + 0, w); |
| 410 | + |
| 411 | + Stage stage = (Stage) canvas.getScene().getWindow(); |
| 412 | + stage.getIcons().clear(); |
| 413 | + stage.getIcons().add(im); |
| 414 | + } |
| 415 | + |
| 416 | + |
| 417 | + List<Image> iconImages; |
| 418 | + |
| 419 | + protected void setProcessingIcon(Stage stage) { |
| 420 | + // Adapted from PSurfaceAWT |
| 421 | + // Note: FX chooses wrong icon size, should be fixed in Java 9, see: |
| 422 | + // https://bugs.openjdk.java.net/browse/JDK-8091186 |
| 423 | + // Removing smaller sizes helps a bit, but big ones are downsized |
| 424 | + try { |
| 425 | + if (iconImages == null) { |
| 426 | + iconImages = new ArrayList<>(); |
| 427 | + final int[] sizes = { 48, 64, 128, 256, 512 }; |
| 428 | + |
| 429 | + for (int sz : sizes) { |
| 430 | + URL url = PApplet.class.getResource("/icon/icon-" + sz + ".png"); |
| 431 | + Image image = new Image(url.toString()); |
| 432 | + iconImages.add(image); |
| 433 | + } |
| 434 | + } |
| 435 | + List<Image> icons = stage.getIcons(); |
| 436 | + icons.clear(); |
| 437 | + icons.addAll(iconImages); |
| 438 | + } catch (Exception e) { } // harmless; keep this to ourselves |
398 | 439 | } |
399 | 440 |
|
400 | 441 |
|
|
0 commit comments