RFR: 8377426: Adjust scene background to color scheme [v2]

Andy Goryachev angorya at openjdk.org
Fri Feb 13 22:32:03 UTC 2026


On Thu, 12 Feb 2026 11:39:33 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> When a non-opaque scene fill color is used with a stage style other than `StageStyle.TRANSPARENT`, the actual fill color is always white. This doesn't work well when the scene uses a dark color scheme. A practical solution is to allow non-opaque scene fill colors, and blend them on top of a white or black background (depending on color scheme) to derive an opaque color that adapts intuitively to the color scheme.
>> 
>> To test this, simply create a scene that uses a non-opaque fill color and observe the scene background when the color scheme is changed.
>> 
>> This PR includes a system test, run it with:
>> 
>> ./gradlew -PFULL_TEST=true -PUSE_ROBOT=true :systemTests:test --tests test.robot.javafx.scene.SceneFillTest.testSceneFill
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Clear background to dominant fill color

This works well on macOS 26.2 (did not test windows/linux).

My biggest gripe is the amount of extra code and effort brought in to slightly improve the flickering color.

In fact, I suspect the added computation might actually exacerbate the problem in the case of image, since it has to compute the background color using non-trivial and time-consuming algorithms.

I would think it might work just as well simply by using the black/white background corresponding to the current theme.  I am curious what other reviewers would say.

modules/javafx.graphics/src/main/java/com/sun/javafx/image/ImageUtils.java line 82:

> 80:             sampleStep = 1;
> 81:         } else {
> 82:             sampleStep = (int)Math.ceil(Math.sqrt((double)numPixels / (double)maxSamples));

`(double)numPixels`
typecast is not needed

modules/javafx.graphics/src/main/java/javafx/scene/Scene.java line 380:

> 378:         addEventFilter(TouchEvent.TOUCH_PRESSED, pressedHandler);
> 379: 
> 380:         context.colorSchemeProperty().addListener((_, _, newValue) -> markDirty(DirtyBits.DARK_SCHEME_DIRTY));

`newValue` is not used, should it be an invalidation listener instead?

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

PR Review: https://git.openjdk.org/jfx/pull/2068#pullrequestreview-3781296469
PR Review Comment: https://git.openjdk.org/jfx/pull/2068#discussion_r2805852420
PR Review Comment: https://git.openjdk.org/jfx/pull/2068#discussion_r2790022865


More information about the openjfx-dev mailing list