To make a JavaFx canvas resizable all that needs to be done is override the min/pref/max methods. Make it resizable and implement the resize method.
With this method no width/height listeners are necessary to trigger a redraw. It is also no longer necessary to bind the size of the width and height to the container.
public class ResizableCanvas extends Canvas { @Override public double minHeight(double width) { return 64; } @Override public double maxHeight(double width) { return 1000; } @Override public double prefHeight(double width) { return minHeight(width); } @Override public double minWidth(double height) { return 0; } @Override public double maxWidth(double height) { return 10000; } @Override public boolean isResizable() { return true; } @Override public void resize(double width, double height) { super.setWidth(width); super.setHeight(height); paint(); }
Note that the resize method cannot simply call Node.resize(width,height), because the standard implementation is effectivele empty.