On Tue, 25 Nov 2025 18:58:14 GMT, Michael Strauß <[email protected]> wrote:

> This enhancement allows `Stage` to be placed on the screen similar to a popup 
> window, where a user-specified positioning anchors defines a point on the 
> stage that should coincide with a given location on the screen. For this 
> purpose, the following new methods are added to `Stage`:
> 
> 
> public class Stage {
>     public void relocate(AnchorPoint screenAnchor, AnchorPoint stageAnchor);
>     public void relocate(AnchorPoint screenAnchor, Insets screenPadding, 
> AnchorPoint stageAnchor, AnchorPolicy);
>     public void relocate(Screen, AnchorPoint screenAnchor, Insets 
> screenPadding, AnchorPoint stageAnchor, AnchorPolicy);
> }
> 
> 
> ## AnchorPoint
> `AnchorPoint` is a point that is either specified in absolute coordinates, or 
> relative to the screen or stage:
> 
> var anchor1 = AnchorPoint.proportional(0.5, 0.5); // center of the 
> screen/stage
> var anchor2 = AnchorPoint.absolute(100, 100); // absolute coordinates within 
> screen/stage
> 
> 
> For example, a stage that sits flush with the bottom-right corner of the 
> screen can be shown as follows:
> 
> var screenAnchor = AnchorPoint.proportional(1, 1); // or use the 
> AnchorPoint.BOTTOM_RIGHT constant
> var stageAnchor = AnchorPoint.proportional(1, 1);
> stage.relocate(screenAnchor, stageAnchor);
> stage.show();
> 
> 
> ## AnchorPolicy
> `AnchorPolicy` controls how the anchor may be adjusted when the preferred 
> placement doesn't fit within the screen bounds:
> 
> 
> public enum AnchorPolicy {
>     FIXED,
>     FLIP_HORIZONTAL,
>     FLIP_VERTICAL,
>     AUTO
> }
> 
> 
> * `FIXED`: always use the provided anchor; only adjust the resulting position 
> to fit within the screen.
> * `FLIP_HORIZONTAL`: if the preferred placement violates horizontal 
> constraints, try a horizontally flipped anchor (e.g. top-left to top-right) 
> before falling back to the original anchor.
> * `FLIP_VERTICAL`: likewise for vertical constraints.
> * `AUTO`: automatically choose the most suitable flip:
>    if only horizontal constraints are violated, acts like `FLIP_HORIZONTAL`;
>    if only vertical constraints are violated, acts like `FLIP_VERTICAL`;
>    if both are violated, try a diagonally flipped anchor (both axes) and pick 
> the placement that requires the least adjustment.
> 
> This is useful for popup-like behavior where you have a preferred "opening 
> direction", but want the window to flip to the opposite side of the reference 
> point when there isn’t enough space (e.g. "prefer below, but open above if 
> below doesn’t fit").
> 
> ### PopupWindow support
> The new `PopupWindow.anchorPolicy` property adds the same "flip the anchor 
> when it...

Looks good!

I wonder if it would make sense to create an exhaustive test for all possible 
combinations of parameters in relocation policy.  For example, the test cases 
can be generated programmatically, the combination and the outcome can be 
captured to a CSV file to be used as a source file for the actual unit test.
Just a suggestion, I think the current tests are probably sufficient.

modules/javafx.graphics/src/main/java/javafx/geometry/AnchorPoint.java line 112:

> 110:     private final boolean proportional;
> 111: 
> 112:     private AnchorPoint(double x, double y, boolean proportional) {

Do we want to specify what happens when numerical values are NaN?
I suppose the infinities are ok, since they will be clamped accordingly.

modules/javafx.graphics/src/main/java/javafx/stage/PopupWindow.java line 651:

> 649:      */
> 650:     private final ObjectProperty<AnchorPolicy> anchorPolicy =
> 651:             new SimpleObjectProperty<>(this, "anchorPolicy", 
> AnchorPolicy.FIXED);

perhaps this property should be lazily created?

(I wish Java would have added the `lazy` keyword:

private final lazy ObProp anchorPolicy = new SimObProp(...);

)

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

Marked as reviewed by angorya (Reviewer).

PR Review: https://git.openjdk.org/jfx/pull/1986#pullrequestreview-3572674421
PR Review Comment: https://git.openjdk.org/jfx/pull/1986#discussion_r2614867822
PR Review Comment: https://git.openjdk.org/jfx/pull/1986#discussion_r2614908060

Reply via email to