I have this very old incomplete attempt I did a long time ago that handles all Processing renderers, including FX2D for Processing 3:
The most relevant parts of that code for JavaFX:
import processing.core.PApplet;
import processing.core.PGraphics;
// FX2D
import javafx.scene.canvas.Canvas;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
protected final PApplet p;
protected final Object window;
protected final PGraphics pg;
public CanvasResizeWatcher(final PApplet pa, boolean now) {
window = ( p = pa ).getSurface().getNative();
pg = pa.getGraphics();
public String discoverRenderer() {
if (window instanceof Canvas) return PApplet.FX2D;
else if (pg.isGL()) return pg.is3D()? PApplet.P3D : PApplet.P2D;
return PApplet.JAVA2D;
}
public interface SizeListener {
SizeListener addListener();
SizeListener removeListener();
}
protected SizeListener createRendererListener(String render) {
if (render == null || render.isEmpty()) render = discoverRenderer();
switch (render) {
case PApplet.P2D:
case PApplet.P3D:
return new SizeListenerOPENGL();
case PApplet.FX2D:
return new SizeListenerFX2D<Double>();
default:
return new SizeListenerJAVA2D();
}
}
public class SizeListenerFX2D<N extends Number>
implements SizeListener, ChangeListener<N> {
public final Canvas win = (Canvas) window;
protected final ChangeListener changeListener = this;
public SizeListenerFX2D() {
if (listener != null) listener.removeListener();
listener = addListener();
}
@Override public SizeListener addListener() {
win.widthProperty().addListener(changeListener);
win.heightProperty().addListener(changeListener);
return this;
}
@Override public SizeListener removeListener() {
win.widthProperty().removeListener(changeListener);
win.heightProperty().removeListener(changeListener);
return this;
}
@Override public void
changed(ObservableValue<? extends N> obs, N old, N cur) {
if (!immediate) resized.set(true);
else invokeCallback();
}
@Override public String toString() {
return discoverRenderer();
}
}