On 07/30/2014 05:12 PM, Werner Lehmann wrote:
layoutChildren() {
...
bip = child1.getBoundsInParent()
if (bip.getMinX() == 0 && bip.getWidth() == 0) {
vbox.layout();
bip = child1.getBoundsInParent();
}
...
}
I assume you don't change "child1" Nodes, so it should work.
It sure does. I have created pane-based controls with manual layouting
before but it is some work to get it right, especially with the
computeMinPrefMaxWidthHeight methods (sometimes +baseline), snapsize
etc pp. I figured it is not worth the hassle here if a vbox and hbox
do 95% of what I need :) A cleaner approach would be to make child2
unmanaged as you suggest but then I need to reserve vertical space in
its vbox container, currently done with css padding on the region
itself. For the time being I have to stick with this and move on.
Yeah, one problem with layouts is when you want to do some layout that
is almost the same as some predefined layout, but you need to tweak it
somehow. Maybe in the future we could add some abstraction and extract
some (parts of) the algorithms we use in our layout containers so they
can be reused in custom layouts.
If you reuse some predefined layout, you'll probably end up with some
hacky code since you'll usually mess up with the inputs for the layout.
The rule of thumb is to use some more complex (GridPane) or free form
(AnchorPane) layout instead of trying to slightly tweak some simple layout.
In your case, wouldn't GridPane do the job? Basically, you have a row of
text nodes and you need a second row where a single rectangle is in the
same column as currently selected (?) text node. The size of the
rectangle can be set to fillWidth the column, so GridPane will do all
the work for you.
-Martin