On Mon, 3 Aug 2026 19:32:41 GMT, Phil Race <[email protected]> wrote:

>> In Aqua L&F, JOptionPane.showInternalMessageDialog does not close after 
>> clicking the close icon button but other buttons like "OK" , "Cancel" works. 
>> It seems `AquaInternalFrameBorder.doButtonAction()` which handles 
>> `kCloseButton `was not called.
>> It is seen that `showInternalMessageDialog()` uses a modal JInternalFrame. 
>> While that internal frame is modal, AWT filters mouse events so only the 
>> modal frame’s contents/children can receive them. Aqua paints and handles 
>> the red close button as part of the JInternalFrame border/title-bar itself 
>> via
>> AquaInternalFrameBorder. drawAllWidgets -> paintButton -> getWidget 
>> (Widget.TITLE_BAR_CLOSE_BOX)
>> https://github.com/openjdk/jdk/blob/5b2d6991a1279d375f9a3c00c7bcd0bbcc7081d6/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java#L393
>> 
>> When close button is presssed, the flow should be
>> https://github.com/openjdk/jdk/blob/5b2d6991a1279d375f9a3c00c7bcd0bbcc7081d6/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java#L528
>>  [records the button hit which delegates to the border]
>> https://github.com/openjdk/jdk/blob/5b2d6991a1279d375f9a3c00c7bcd0bbcc7081d6/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java#L536
>>  
>> https://github.com/openjdk/jdk/blob/5b2d6991a1279d375f9a3c00c7bcd0bbcc7081d6/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java#L265
>> 
>> but it never gets called since
>> the click target was the modal JInternalFrame itself, not a child component, 
>> so the modal filter consumed the event before Aqua code ever saw it,
>> 
>> The fix is to allow events targeted at the modal component itself too
>> 
>> It works for other L&F like Windows because they use Swing JButton for close 
>> button component in the internal frame title pane. so the click target is a 
>> child of the modal JInternalFrame, so the filter check is passed.
>> There doesn't seem to be a way to fix in macosx classes because Aqua never 
>> receives the blocked event. The event is consumed earlier in shared AWT 
>> lightweight-modal dispatch code so the fix is made there
>> CI testing is ok and no regression observed.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> In the bug report I specifically asked for a fix that looks at all L&Fs and 
> makes everything consistent.
> See my comment written on 7/23.
> 
> The actual fix may be to hide these close buttons for all L&Fs
> i.e Metal - the standard cross platform L&F doesn't provide the close button 
> at all in such a case and Nimbus is incomprehensible.
>  
> i.e
> -  the L&Fs should be consistent in whether they are visible and enabled or 
> not. It is NOT clear to me that they should be there at all.
> - this could be "informed" by what the "top-level" ones do, but it seemed to 
> me that there was an intent for internal ones to be different.
>  - if a button is visible and enabled it should work. 
> - if there's a platform L&F reason to vary it should be identified and 
> explained

@prrace @azuev-java please review

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

PR Comment: https://git.openjdk.org/jdk/pull/32169#issuecomment-5525068738

Reply via email to