On Tue, 26 Aug 2025 07:11:53 GMT, Prasanta Sadhukhan <[email protected]> 
wrote:

>> When the component orientation is changed from LTR to RTL or the other way 
>> around, JSplitPane exchanges the left and right components. However, it does 
>> this by adding and removing components instead of swapping the leftComponent 
>> and rightComponent fields which results in leftComponent field is left as 
>> null.
>> 
>> This is because when JSplitPane calls `setLeftComponent(rightComponent)` it 
>> calls `JSplitPane.addImpl` which calls `super.addImpl`
>> which [removes] 
>> https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/java/awt/Container.java#L1118
>>  the component from the JSplitPane as it calls `JSplitPane.remove` so the 
>> sequence is
>> At start `leftComponent = Red, rightComponent = Green`
>> 
>> before `super.addImpl` is called in `JSplitPane.addImpl` the 
>> 
>> `leftComponent = Green, rightComponent = Green`
>> 
>> After super.addImpl is called, it calls [JSplitPane.remove] 
>> (https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/javax/swing/JSplitPane.java#L918)
>>  where it sets
>> leftComponent = null.
>> 
>> so we have
>> leftComponent = null, rightComponent = Green and then it calls 
>> [super.remove] 
>> (https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/javax/swing/JSplitPane.java#L922)
>>  which calls `JSplitPane.remove(index)` and since index=1 because "Green" is 
>> 1 it removes rightComponent 
>> so we have now
>> leftComponent = null, rightComponent = null
>> 
>> so when we now call 
>> [setRightComponent](https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/javax/swing/JSplitPane.java#L382)
>>  it sets rightComponent to Red but leftComponent is not set and is still 
>> null.
>> 
>> So fix is to just swap the left and right component in 
>> setComponentOrientation call itself without using Container add/remove 
>> components
>
> Prasanta Sadhukhan has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Fire property change notification instead

I understand `ORIENTATION_PROPERTY` is supposedly meant for horizontal/vertical 
orientation change but what the code is doing on receipt of this PropertyChange 
event is exactly what we want it for ComponentOrientation change which is to 
update the layout manager components

https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java#L2170-L2172

https://github.com/openjdk/jdk/blob/f423e1d9ad37135abacb8deb2d2151e21768a23e/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java#L1204-L1211

Moreover, `layoutManager` is protected field of `BasicSplitPaneUI` which is not 
accessible from JSplitPane

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

PR Comment: https://git.openjdk.org/jdk/pull/26893#issuecomment-3235505904

Reply via email to