> 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 ...

John Hendrikx has updated the pull request with a new target base due to a 
merge or a rebase. The pull request now contains nine commits:

 - Remove whitespace
 - Add @since to RenderScaleContext
 - Merge remote-tracking branch 'origin/master' into feature/layoutable
 - Add BorderPaneLayout
   
   - Fix snapToPixel not calling requestLayout
   - Fix shadowing of arguments in StackPaneLayout
   - Remove Snapper.DEFAULT to Snapper.IDENTITY
   - Add missing @Override
   - Add missing @Since on public types
   - Minor javadoc adjustments
   - Rename LayoutSupport to LayoutUtils
 - Fix types and removed redundant isResizable checks
 - Address some review comments
 - Remove white space at end of line
 - Add StackPaneLayout, move Region helpers to LayoutSupport
 - Create new interfaces Layoutable and Measurable and use by Node

-------------

Changes: https://git.openjdk.org/jfx/pull/2241/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2241&range=04
  Stats: 3053 lines in 18 files changed: 2288 ins; 636 del; 129 mod
  Patch: https://git.openjdk.org/jfx/pull/2241.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2241/head:pull/2241

PR: https://git.openjdk.org/jfx/pull/2241

Reply via email to