RFR: 8365886: JSplitPane loses track of the left component when the component orientation is changed

Jean-Noël Rouvignac duke at openjdk.org
Fri Aug 22 12:01:52 UTC 2025


On Fri, 22 Aug 2025 03:53:13 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> 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

src/java.desktop/share/classes/javax/swing/JSplitPane.java line 374:

> 372:         ComponentOrientation curOrn = this.getComponentOrientation();
> 373:         super.setComponentOrientation(orientation);
> 374:         Component comp = null;

Rename comp to tmp? Or swap?
And also reduce its scope by moving the declaration where it is assigned, this makes the code clearer. 
Maybe use var even?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/26893#discussion_r2293530774


More information about the client-libs-dev mailing list