Hi Martin,
To be clear; I check the sizes of all my children, the problem is in the fact
that my layout's layoutChildren() is called without its compute* methods being
called prior to that. Hence the calculations are not done and I get an NPE.
I have printlns in the compute* and layoutChildren methods, and as you can see
the compute* methods are not called. Even if I work around the NPE and resize
the window, the compute* are never called.
/layoutChildren() //
//java.lang.NullPointerException//
// at
jfxtras.labs.scene.layout.CircularPane.layoutChildren(CircularPane.java:216)//
// at javafx.scene.Parent.layout(Parent.java:1076)//
// at javafx.scene.Scene.doLayoutPass(Scene.java:576)//
// at javafx.scene.Scene.preferredSize(Scene.java:1579)//
// at javafx.scene.Scene.impl_preferredSize(Scene.java:1653)//
// at javafx.stage.Window$SceneModel.invalidated(Window.java:478)//
// at
javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111)//
// at
javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)//
// at javafx.stage.Window.setScene(Window.java:436)//
// at javafx.stage.Stage.setScene(Stage.java:240)//
// at org.loadui.testfx.GuiTest$1.run(GuiTest.java:128)//
// at org.loadui.testfx.FXTestUtils$4.call(FXTestUtils.java:151)//
// at org.loadui.testfx.FXTestUtils$4.call(FXTestUtils.java:147)//
// at org.loadui.testfx.FXTestUtils$3.run(FXTestUtils.java:109)//
// at
com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)//
// at
com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)//
// at java.security.AccessController.doPrivileged(Native Method)//
// at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)//
// at
com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)//
// at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)//
// at
com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)//
// at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)//
// at java.lang.Thread.run(Thread.java:744)//
/
Now, TestFX uses a deviating way of initializing the Stage and Scene, but in
the end it simply does a setScene, which ends up in my layoutChildren without
reaching out to compute*.
Tom
On 2014-4-2 18:42, Martin Sladecek wrote:
Hi Tom,
in all of our layout panes we do check for min/pref/max size (I think), but strictly
speaking they are all just size hints so I can imagine a layout pane which would not
check for these and compute the size of the child in some different way. On the other
hand, the size hints, esp. min size gives an information about the minimum size of the
Node with which is the Node "usable".
But to be safe, you should always check for validity of your cached
calculations in all compute* methods + at the beginning of layoutChildren().
-Martin
On 2.4.2014 16:34, Tom Eugelink wrote:
I'm currently working on a circular pane and am in the phase of writing tests.
For optimalisation the layout does some (cached) calculations in the
computePrefWidth, because, after all, how can a node be laid out if its
container does not know what its min and pref sizes are? This works perfectly
for all the trials I've written, putting the pane directly into the scene, or
part of other panes.
But in the test (using TestFX) the layoutChildren() is called without ever
calling computeMin/PrefWidth... Does that make sense?
Tom