Skip to content

Commit 85657d6

Browse files
committed
FX: window icons
1 parent 429d51a commit 85657d6

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

core/src/processing/javafx/PSurfaceFX.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
import java.awt.GraphicsDevice;
2626
import java.awt.GraphicsEnvironment;
2727
import java.awt.Rectangle;
28+
import java.net.URL;
29+
import java.util.ArrayList;
2830
import java.util.HashMap;
31+
import java.util.List;
2932
import java.util.Map;
3033

3134
import javafx.animation.Animation;
@@ -43,6 +46,7 @@
4346
import javafx.scene.Scene;
4447
import javafx.scene.SceneAntialiasing;
4548
import javafx.scene.canvas.Canvas;
49+
import javafx.scene.image.Image;
4650
import javafx.scene.image.PixelFormat;
4751
import javafx.scene.image.WritableImage;
4852
import javafx.scene.input.KeyCode;
@@ -356,6 +360,8 @@ public void run() {
356360
Thread.sleep(5);
357361
} catch (InterruptedException e) { }
358362
}
363+
364+
setProcessingIcon(stage);
359365
}
360366

361367

@@ -394,7 +400,42 @@ public void setResizable(boolean resizable) {
394400

395401

396402
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
398439
}
399440

400441

0 commit comments

Comments
 (0)