mirror of
https://github.com/processing/processing4.git
synced 2026-02-11 01:29:17 +01:00
Merge pull request #4411 from JakubValtar/bugfix-fx
cursors, window icons, and dispose() for JavaFX
This commit is contained in:
@@ -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<Image> 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<Image> 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user