RFR: 4938801: The popup does not go when the component is removed. [v5]

Prasanta Sadhukhan psadhukhan at openjdk.org
Tue Jul 29 11:56:53 UTC 2025


On Fri, 25 Jul 2025 16:37:54 GMT, Alexey Ivanov <aivanov at openjdk.org> wrote:

>> Prasanta Sadhukhan has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Use setVisible(false) instead of dispose, update test
>
> src/java.desktop/share/classes/javax/swing/JPopupMenu.java line 129:
> 
>> 127:     transient  Frame frame;
>> 128:     private    int desiredLocationX,desiredLocationY;
>> 129:     transient private PropertyChangeListener propListener =
> 
> Suggestion:
> 
>     private transient PropertyChangeListener propListener =
> 
> Use blessed modifier order.

ok

> src/java.desktop/share/classes/javax/swing/JPopupMenu.java line 142:
> 
>> 140:                 }
>> 141:             }
>> 142:         };
> 
> Anonymous class can be replaced with lambda¹:
> Suggestion:
> 
>             (e) -> {
>                 if (e.getOldValue() != null
>                     && e.getNewValue() == null
>                     && isVisible()) {
>                     setVisible(false);
>                 }
>             };
> 
> If you use the named property listener, checking the name of the property can be safely dropped, and the nested `if` blocks could be chained with the `&&` operator.
> 
> ¹ @DamonGuy [advocated using lambdas in such cases](https://github.com/openjdk/jdk/pull/22977#discussion_r1909302224).

ok..modified..

> src/java.desktop/share/classes/javax/swing/JPopupMenu.java line 965:
> 
>> 963:                 oldInvoker.removePropertyChangeListener(oldPropListener);
>> 964:             }
>> 965:             invoker.addPropertyChangeListener(propListener);
> 
> Suggestion:
> 
> 
>         if ((oldInvoker != this.invoker) && (ui != null)) {
>             ui.uninstallUI(this);
>             if (oldInvoker != null) {
>                 oldInvoker.removePropertyChangeListener(propListener);
>             }
>             invoker.addPropertyChangeListener(propListener);
> 
> `oldPropListener` is not needed, the instance never changes.

fixed..

> src/java.desktop/share/classes/javax/swing/JPopupMenu.java line 965:
> 
>> 963:                 oldInvoker.removePropertyChangeListener(oldPropListener);
>> 964:             }
>> 965:             invoker.addPropertyChangeListener(propListener);
> 
> Suggestion:
> 
>             if (oldInvoker != null) {
>                 oldInvoker.removePropertyChangeListener("ancestor", oldPropListener);
>             }
>             invoker.addPropertyChangeListener("ancestor", propListener);
> 
> Use named property listener, it's more efficient since the listener won't be called for any other properties.

ok

> src/java.desktop/share/classes/javax/swing/JPopupMenu.java line 1383:
> 
>> 1381:             values.addElement("propListener");
>> 1382:             values.addElement(propListener);
>> 1383:         }
> 
> Do we need to serialise `propListener`? What is the value in serialising the listener?
> 
> Will `invoker` serialise `propListener`? If it does, then we need to serialise it to be able to remove the listener after the components are deserialised and the `invoker` is changed.

There was failure in CI in some test citing NotSerializableException which was solved by serialising propListener

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

PR Review Comment: https://git.openjdk.org/jdk/pull/26407#discussion_r2239551917
PR Review Comment: https://git.openjdk.org/jdk/pull/26407#discussion_r2239553307
PR Review Comment: https://git.openjdk.org/jdk/pull/26407#discussion_r2239552668
PR Review Comment: https://git.openjdk.org/jdk/pull/26407#discussion_r2239552914
PR Review Comment: https://git.openjdk.org/jdk/pull/26407#discussion_r2239556446


More information about the client-libs-dev mailing list