On Mon, 3 Aug 2026 16:34:14 GMT, John Hendrikx <[email protected]> wrote:
> This PR shows how virtual layouts could be implemented, as discussed on the > mailinglist: > https://mail.openjdk.org/archives/list/[email protected]/thread/PLNSQ3ZI63AVKEFKNT5GT6WHAD2GYMPC/ > > It would work by making new non-Node containers called Layouts which can > contain a mix of either Nodes or other Layouts. Allowing Layouts to nest > makes it possible to create a substructure similar to how nesting > StackPane/HBox/VBox etc works today. An example is a simple control that has > a graphic with a title and subtitle stacked vertically next to it: > > > +-------------+-----------------------------------------+ > | | | > | | Title | > | | | > | Graphic +-----------------------------------------+ > | | | > | | Subtitle | > | | | > +-------------+-----------------------------------------+ > > For a control to model this, it would need a VBox containing the Title and > Subtitle, and an HBox containing the Graphic and the VBox. The two > containers are heavy-weight Nodes and this incurs sufficiently large memory > and performance penalties that most standard JavaFX controls will opt to > instead roll their own layout code to avoid paying the cost for these. > > With virtual layouts, the control could make use of non-Node containers. The > control would add its three children (Graphic, Title and Subtitle) as direct > children for display in the scene graph, but would offload their positioning > to a virtual layout. This roughly looks like this: > > > public class TitledGraphic extends Region { > private final HBoxLayout root; > > public TitledGraphic(Node graphic, String titleText, String > subtitleText) { > // Flat scene graph: > getChildren().addAll(graphic, title, subtitle); > > // Create virtual layout: > root = HBoxLayout.of(graphic, VBoxLayout.of(title, subtitle)); > } > > @Override > protected void layoutChildren() { > root.resizeRelocate(0, 0, getWidth(), getHeight()); > } > > @Override protected double computeMinWidth(double height) { return > root.minWidth(height); } > @Override protected double computeMinHeight(double width) { return > root.minHeight(width); } > @Override protected double computePrefWidth(double height) { return ... Since this is now `rfr`, I'll add the required `csr` label. ------------- PR Comment: https://git.openjdk.org/jfx/pull/2241#issuecomment-5181177111
