On Thu, 8 Jan 2026 10:53:58 GMT, Pabulaner IV <[email protected]> wrote:

>> This pull request fixes the system menu bar on MacOS when combining windows 
>> of Swing and JavaFX.
>> 
>> # Behavior before
>> 
>> If for some reason You needed to initialize AWT before JavaFX and You wanted 
>> to install the system menu bar from the JavaFX side, this wasn't possible. 
>> This issue is persistent even when You didn't open a Swing window. 
>> 
>> One scenario where this kind of issue happens is when You use install4j (see 
>> https://www.ej-technologies.com/install4j). In this case AWT is initialized 
>> by install4j and therefore You can't use the JavaFX system menu bar anymore.
>> 
>> 
>> # Behavior after
>> 
>> The fix allows JavaFX to install a system menu bar even if it is initialized 
>> after AWT. This is achieved by only changing code inside JavaFX. Each JavaFX 
>> window stores the previously installed menu bar when gaining focus and will 
>> restore this menu bar if the focus was lost. This only happens if the system 
>> menu bar installed by the JavaFX window is still unchanged.
>> 
>> 
>> # Tests
>> 
>> This PR introduces tests for the system menu bar in addition to verifying 
>> its own behavior / changes. The tests include single- and multi-window tests 
>> while interacting with Swing. The tests ensure that the menu bar stays the 
>> same for each window, no matter how You switch focus between them.
>> 
>> 
>> # Additional benifits 
>> 
>> This fix is not specifically for AWT, but allows JavaFX to interact much 
>> more compatibly with other frameworks that make use of the system menu bar.
>> 
>> 
>> # Review from AWT
>> 
>> In the previous PR related to this one, the comment was made that the folks 
>> from AWT should take a look at this fix. It would be great and much 
>> appreciated if someone could initiate it.
>> 
>> 
>> # Add disable flag?
>> 
>> We could also add a flag to prevent JavaFX from installing a system menu bar 
>> for users who have found other fixes for their projects / setups. This could 
>> be used to restore the previous behavior when AWT is initialized first.
>> 
>> 
>> Co-Author: @FlorianKirmaier
>
> Pabulaner IV has updated the pull request incrementally with two additional 
> commits since the last revision:
> 
>  - 8359108: Mac - When Swing starts First, native application menu doesn't 
> work for JavaFX
>  - 8359108: Mac - When Swing starts First, native application menu doesn't 
> work for JavaFX

I think I understand what's going on now (it helps that I'm no longer on 
vacation and no longer on jury duty). Again, this PR concerns what happens when 
you have a top-level JavaFX window focused inside an AWT application.

In the past the only application menu you would see would be provided by AWT. 
The AWT application menu always has an About item and optionally has a Settings 
item if the client has called `Desktop.setPreferencesHandler`. With this PR 
when a JavaFX window is focused you'll see the JavaFX version of the 
application menu, not the AWT one. That might be considered a regression though 
it's hard to say since I think this whole setup is officially unsupported (?)

@crschnick The MenuBar.java test you provided illustrates something entirely 
new. When a top-level JavaFX window is focused in an AWT application and you 
call `Desktop.setPreferencesHandler` AWT will manipulate the JavaFX platform 
menu and insert the Settings item into it. The result is a weird menu with 
Settings in the wrong location and a mix of NSMenuItems created by Glass and 
AWT. Again, technically a bug but maybe the resolution is just to tell 
developers to not do that.

The MenuBar.java test only reproduces the issue when run inside the jfx-test 
harness. When run as a standalone program the issue doesn't reproduce (Settings 
never appears in the application menu). This is true even after I tweaked 
`main` to ensure it ran. In the future please provide a stand-alone reproducer.

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

PR Comment: https://git.openjdk.org/jfx/pull/1904#issuecomment-4389512538

Reply via email to