On Wed, 4 Sep 2024 00:54:16 GMT, Damon Nguyen <[email protected]> wrote:

> In a JComboBox, if the user opens the dropdown list and clicks and holds the 
> down-button, then ALT-TABs to switch focus, when the user re-focuses the 
> frame with the JComboBox and opens the dropdown list again, the list will 
> still be scrolling even though the down-button isn't pressed.
> 
> This isn't OS or L&F specific, although Aqua L&F does not have any 
> directional arrows in the dropdown list (and is thus exempt). This led me to 
> believe it could be handled in BasicComboBoxUI where focusLost and focusGain 
> are used or isPopupVisible but the scroll behavior cannot be altered here. 
> Likewise for BasicComboPopup where `autoscroll` is used. However, this 
> behavior isn't related to autoscroll and is actually found in the JScrollbar 
> of the JScrollpane inside of the JComboBox. The timer for the scroll action 
> starts but is never stopped if focus is lost, so a new listener is created 
> and used. The proposed solution uses `KeyboardFocusManager` to track the 
> focus owner. The listener stops the `scrollTimer` when the `focusOwner` 
> property is changed. With this change, the list no longer automatically 
> scrolls when re-focused and instead opens normally.
> 
> The included test is manual due to the need to confirm that the list still 
> scrolls after ALT-TABing. The L&F is set to Metal since it is the 
> cross-platform lookandfeel and has directional buttons for the JScrollPane 
> list.

src/java.desktop/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java 
line 371:

> 369:         scrollbar.addPropertyChangeListener(propertyChangeListener);
> 370:         scrollbar.addFocusListener(getHandler());
> 371:         
> keyboardFocusManager.addPropertyChangeListener(keyboardFocusListener);

creating `keyboardFocusManager` instance can be avoided and we can directly use 
`KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener(keyboardFocusListener);`
 to add the listener and similarly to remove.

test/jdk/javax/swing/JComboBox/JComboBoxScrollFocusTest.java line 75:

> 73:         JFrame frame = new JFrame("JComboBoxScrollFocusTest Test Frame");
> 74:         JComboBox combobox = new JComboBox();
> 75:         for (int i = 0; i< 100; i ++) {

Suggestion:

        for (int i = 0; i < 100; i++) {

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

PR Review Comment: https://git.openjdk.org/jdk/pull/20845#discussion_r1743717017
PR Review Comment: https://git.openjdk.org/jdk/pull/20845#discussion_r1743692496

Reply via email to