Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
DamonGuy committed Sep 4, 2024
1 parent 3f8b3e5 commit 0cc3caf
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -31,6 +31,7 @@
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
Expand Down Expand Up @@ -121,6 +122,10 @@ public class BasicScrollBarUI
protected ArrowButtonListener buttonListener;
/** Model listener */
protected ModelListener modelListener;
/** KeyboardFocusListener */
protected KeyboardFocusListener keyboardFocusListener;
/** KeyboardFocusManager */
protected KeyboardFocusManager keyboardFocusManager;

/** Thumb rectangle */
protected Rectangle thumbRect;
Expand Down Expand Up @@ -355,12 +360,15 @@ protected void installListeners(){
buttonListener = createArrowButtonListener();
modelListener = createModelListener();
propertyChangeListener = createPropertyChangeListener();
keyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyboardFocusListener = createKeyboardFocusListener();

scrollbar.addMouseListener(trackListener);
scrollbar.addMouseMotionListener(trackListener);
scrollbar.getModel().addChangeListener(modelListener);
scrollbar.addPropertyChangeListener(propertyChangeListener);
scrollbar.addFocusListener(getHandler());
keyboardFocusManager.addPropertyChangeListener(keyboardFocusListener);

if (incrButton != null) {
incrButton.addMouseListener(buttonListener);
Expand Down Expand Up @@ -442,6 +450,8 @@ protected void uninstallListeners() {
incrButton.removeMouseListener(buttonListener);
}

keyboardFocusManager.removePropertyChangeListener(keyboardFocusListener);
keyboardFocusManager = null;
scrollbar.getModel().removeChangeListener(modelListener);
scrollbar.removeMouseListener(trackListener);
scrollbar.removeMouseMotionListener(trackListener);
Expand Down Expand Up @@ -508,6 +518,14 @@ protected PropertyChangeListener createPropertyChangeListener() {
return getHandler();
}

/**
* Creates a keyboard focus listener.
* @return a keyboard focus listener
*/
protected KeyboardFocusListener createKeyboardFocusListener(){
return new KeyboardFocusListener();
}

private void updateThumbState(int x, int y) {
Rectangle rect = getThumbBounds();

Expand Down Expand Up @@ -1201,6 +1219,28 @@ public boolean getSupportsAbsolutePositioning() {
return supportsAbsolutePositioning;
}

/**
* A listener to listen for keyboard focus changes.
*/
protected class KeyboardFocusListener implements PropertyChangeListener {
/**
* Constructs a {@code KeyboardFocusListener}.
*/
protected KeyboardFocusListener() {}

@Override
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();

if ("focusOwner" == propertyName) {
// Stop scrolling if no longer focus owner
if (e.getNewValue() == null && scrollTimer.isRunning()) {
scrollTimer.stop();
}
}
}
}

/**
* A listener to listen for model changes.
*/
Expand Down
85 changes: 85 additions & 0 deletions test/jdk/javax/swing/JComboBox/JComboBoxScrollFocusTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

import java.awt.AWTException;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/*
* @test
* @bug 6672644
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @summary Tests JComboBox scrollbar behavior when alt-tabbing
* @run main/manual JComboBoxScrollFocusTest
*/

public class JComboBoxScrollFocusTest {
private static final String INSTRUCTIONS =
"""
Click on the dropdown button for the JComboBox in the test frame.
Then, press and hold left click on the down arrow button in the
popup list. While holding left click, the list should be scrolling
down. Press ALT + TAB while holding down left click to switch
focus to a different window. Focus the test frame again and click
the dropdown button for the JComboBox again. The list should not
be automatically scrolling.
If you are able to execute all steps successfully then the test
passes, otherwise it fails.
""";

public static void main(String[] args) throws
UnsupportedLookAndFeelException, ClassNotFoundException,
InstantiationException, IllegalAccessException, AWTException,
InterruptedException, InvocationTargetException {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
PassFailJFrame
.builder()
.title("JComboBoxScrollFocusTest Test Instructions")
.instructions(INSTRUCTIONS)
.rows((int) INSTRUCTIONS.lines().count() + 2)
.columns(40)
.testUI(JComboBoxScrollFocusTest::createAndShowGUI)
.build()
.awaitAndCheck();
}

private static JFrame createAndShowGUI() {
JFrame frame = new JFrame("JComboBoxScrollFocusTest Test Frame");
JComboBox combobox = new JComboBox();
for (int i = 0; i< 100; i ++) {
combobox.addItem(String.valueOf(i));
}
frame.add(combobox);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
return frame;
}
}

0 comments on commit 0cc3caf

Please sign in to comment.