> On Nov 12, 2021, at 7:48 PM, Kevin Rushforth <kevin.rushfo...@oracle.com> > wrote: > > I think this will be a good improvement to implement to the JavaFX layout > algorithm. I see that you filed JDK-8276671 [1] to track this enhancement. > > As noted, the main concern will be making sure we don't break existing > applications, so testing this will be key. > > One other issue that will need to be addressed is what a good the threshold > would be for the maximum number of iterations, such that if it doesn't > converge we will stop anyway (and log a warning). This is a trade-off between > performance and accuracy, although as noted in the JBS issue, if the layout > doesn't converge it's a bug. The value we ultimately choose can be discussed > during the review and testing. Regardless of what the threshold is, I > recommend a system property (named something like > "com.sun.javafx.scene.layout.threshold"). This will be helpful during testing. > > What do other developers think?
Sounds good to me. I’m all for it. > Would this be a useful problem to solve in layout? Absolutely. I have dialogs that have really irritating layout issues that magically correct themselves when you interact with the controls. Scott > > -- Kevin > > [1] https://bugs.openjdk.java.net/browse/JDK-8276671 > > >> On 11/4/2021 7:31 PM, Michael Strauß wrote: >> I previously proposed a new iterative layout algorithm [1] that >> supports baseline alignment and introduces new APIs to give developers >> control over the way nodes are aligned. This is a solution to the >> long-standing problem that JavaFX cannot reliably lay out nodes that >> are aligned on their baseline [2]. The new layout algorithm might also >> fix some issues where the scene graph layout only settles after >> interacting with the controls (for example, by clicking). >> >> I've created a small application that shows the new APIs and a >> correctly working baseline-aligned layout [3]. In addition to that, I >> also built SceneBuilder with both the old and new layout system, and >> played around with it to find out whether there were any regressions >> or visual differences. So far, I haven't found any. >> >> In order to move this forward, I think it would be a good idea to test >> the latest version of the new layout system in more real-world JavaFX >> applications. Any help from JavaFX application developers is greatly >> appreciated. It's as easy as checking out the JavaFX sources from the >> PR [1], building a local SDK and linking your application with the >> binaries. >> >> >> Finally, here's a high-level overview of the new algorithm: >> >> When Parent::layout() is called on a layout root (i.e. a scene root or >> an unmanaged node), it will lay out its children in a loop until the >> scene graph under the layout root is fully laid out, which means it is >> clean and doesn't require further layout. The totality of layout >> activity for a single layout root is called "layout cycle". A layout >> cycle will often take a few layout passes to finish (but not more than >> 2 in most cases). There is no limit on how often Parent::layout() will >> iterate to lay out its children, so in principle, this could lead to >> an infinite layout loop. >> >> One source of infinite layout loops are incorrectly implemented controls: >> >> class PathologicalControl extends Region { >> final Text text = new Text("foo"); >> >> PathologicalControl() { >> getChildren().add(text); >> } >> >> @Override >> protected void layoutChildren() { >> text.relocate(0, text.getLayoutY() + 10); >> } >> } >> >> In this example, each call to layoutChildren() moves down the text >> node another 10 pixels from where it was, which causes the layout >> algorithm to schedule yet another layout pass. It's an infinite loop. >> >> The layout system detects this by tracking how often a node >> invalidates the scene graph in a single layout cycle. If a node >> exceeds a threshold of 100 invalidations, it will be suspended from >> layout and can no longer invalidate the scene graph in the current >> layout cycle. A warning will be logged to notify developers of that >> fact. >> >> >> [1] https://github.com/openjdk/jfx/pull/433 >> [2] https://bugs.openjdk.java.net/browse/JDK-8090261 >> [3] https://github.com/mstr2/jfx-layout-sample >