RFR: 6510914: JScrollBar.getMinimumSize() breaks the contract of JComponent.setMinimumSize() [v7]

Alexey Ivanov aivanov at openjdk.org
Tue Jan 2 20:08:47 UTC 2024


On Tue, 21 Nov 2023 03:33:21 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

>> javadoc contract for JComponent.setMinimumSize(Dimension) states:
>> 
>> "Sets the minimum size of this component to a constant value. Subsequent calls to getMinimumSize will always return this value..."
>> 
>> However, JScrollBar overrides getMinimumSize() and breaks this contract - it always returns a minimum size derived from the preferred size even if you have previously called setMinimumSize()
>> 
>> Fix is made to check if mnimumSize is set and if so, honour it..
>
> Prasanta Sadhukhan has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Override set*Methods and update spec

> > That is we preserve the current behaviour of `getMinimumSize()` and `getMaximumSize()` methods in `JScrollBar`, yet if `setMinimumSize()` or `setMaximumSize()` is called, the corresponding `get-` methods return the set value and thus they follow the contract specified in `JComponent`.
> > @prrace, could you confirm, please?
> 
> I already mentioned to him in this comment [#15325 (comment)](https://github.com/openjdk/jdk/pull/15325#issuecomment-1818768822) that moving back to initial fix iteration will cause the same problem as you mentioned [#15325 (comment)](https://github.com/openjdk/jdk/pull/15325#issuecomment-1796167220) which is the same what we observed when we removed these 2 getXXX methods (which was mentioned in hmuller comment) so if we are OK with the change in behaviour as compared to current, then removing these 2 methods may be considered as compared to moving to 1st iteration of this fix...

Right. The change in behaviour will still be there.

Personally, I think we should keep the current behaviour and document it. At the same time, I accept what Phil suggested: the behaviour remains the same unless `setMinimumSize()` or `setMaximumSize()` are called. The latter relies on [the assumptions](https://github.com/openjdk/jdk/pull/15325#issuecomment-1816933906):

> I suspect very few apps actually call these since they are complete no-ops today.

Phil notes: 

> If we do that, then yes, you'll still see differences if you do call those APIs and forgot about it because it didn't make a difference.

Hence, there's a risk to break those few apps.

This is why I prefer Phil's second suggestion:

> If that isn't going to work, then, I think we should fall back to the pure documentation solution.  
> Well, almost pure docs, but not quite, because we need a no-op over-ride of `set*` on which to place the docs.

This way, no app could be broken because the behaviour doesn't change, but the specification for `JScrollBar` changes.

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

PR Comment: https://git.openjdk.org/jdk/pull/15325#issuecomment-1874490256


More information about the client-libs-dev mailing list