# JavaFX Controls in Default Window

**URL:** https://discourse.processing.org/t/javafx-controls-in-default-window/46404
**Category:** Development
**Created:** [May 17, 2025, 2:09pm UTC](https://discourse.processing.org/t/javafx-controls-in-default-window/46404 "2025-05-17T14:09:49Z")
**Posts on this page:** 1
**Showing post:** 2

<div class="post-metadata">

### Author: ![GoToLoop](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/gotoloop/32/86_2.png) [@GoToLoop](https://discourse.processing.org/u/GoToLoop)
#### Post date: [May 17, 2025, 3:29pm UTC](https://discourse.processing.org/t/javafx-controls-in-default-window/46404/2 "2025-05-17T15:29:44Z")

</div>

I have this very old incomplete attempt I did a long time ago that handles all Processing renderers, including [FX2D](https://processing.github.io/processing-javadocs/core/processing/core/PConstants.html#FX2D) for Processing 3:

> [@Event called when canvas is resized](https://discourse.processing.org/t/event-called-when-canvas-is-resized/6643/8):
>
> Hi @Sarah! Here’s a sketch I’ve been working w/ many months ago. construction_worker_man It’s about creating a class callback which triggers every time the canvas resizes. robot It’s still experimental. man_scientist Yet to finish it 100% . But it’s runnable already: running_man

The most relevant parts of that code for JavaFX:

```auto
import processing.core.PApplet;
import processing.core.PGraphics;

```

```auto
// FX2D
import javafx.scene.canvas.Canvas;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

```

```auto
protected final PApplet p;
protected final Object window;
protected final PGraphics pg;

```

```auto
public CanvasResizeWatcher(final PApplet pa, boolean now) {
  window = ( p = pa ).getSurface().getNative();
  pg = pa.getGraphics();

```

```auto
public String discoverRenderer() {
  if (window instanceof Canvas) return PApplet.FX2D;
  else if (pg.isGL()) return pg.is3D()? PApplet.P3D : PApplet.P2D;
  return PApplet.JAVA2D;
}

```

```auto
public interface SizeListener {
  SizeListener addListener();
  SizeListener removeListener();
}

```

```auto
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();
  }
}

```

```auto
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();
  }
}

```

---

_[View the full topic](https://discourse.processing.org/t/javafx-controls-in-default-window/46404)._
