8147994: [macosx] JScrollPane jitters up/down during trackpad scrolling on MacOS/Aqua
Reviewed-by: alexp, aivanov
diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
index 190b94b..f134ad1 100644
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, 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
@@ -870,18 +870,13 @@
int orientation = SwingConstants.VERTICAL;
// find which scrollbar to scroll, or return if none
- if (toScroll == null || !toScroll.isVisible()) {
+ if (toScroll == null || !toScroll.isVisible()
+ || e.isShiftDown()) {
toScroll = scrollpane.getHorizontalScrollBar();
if (toScroll == null || !toScroll.isVisible()) {
return;
}
orientation = SwingConstants.HORIZONTAL;
- } else if(e.isShiftDown()){
- JScrollBar hScroll = scrollpane.getHorizontalScrollBar();
- if (hScroll != null && hScroll.isVisible()) {
- toScroll = hScroll;
- orientation = SwingConstants.HORIZONTAL;
- }
}
e.consume();
diff --git a/jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java b/jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
similarity index 77%
rename from jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java
rename to jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
index 190390d..3c42ec7 100644
--- a/jdk/test/javax/swing/JScrollPane/8033000/bug8033000.java
+++ b/jdk/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.Robot;
@@ -29,22 +30,23 @@
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
+
import sun.awt.OSInfo;
/**
* @test
- * @bug 8033000
+ * @bug 8033000 8147994
* @author Alexander Scherbatiy
* @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
- * @run main bug8033000
+ * @run main HorizontalMouseWheelOnShiftPressed
*/
-public class bug8033000 {
+public class HorizontalMouseWheelOnShiftPressed {
private static JScrollPane scrollPane;
private static JTextArea textArea;
private static Point point;
private static final int delta;
+ private static JFrame frame;
static {
delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
@@ -55,9 +57,17 @@
Robot robot = new Robot();
robot.setAutoDelay(50);
- SwingUtilities.invokeAndWait(bug8033000::createAndShowGUI);
+ SwingUtilities.invokeAndWait(
+ HorizontalMouseWheelOnShiftPressed::createAndShowGUI);
robot.waitForIdle();
+ try {
+ test(robot);
+ } finally {
+ frame.dispose();
+ }
+ }
+ private static void test(Robot robot) throws Exception {
SwingUtilities.invokeAndWait(() -> {
Point locationOnScreen = scrollPane.getLocationOnScreen();
point = new Point(
@@ -73,7 +83,7 @@
robot.waitForIdle();
robot.mouseWheel(delta);
robot.waitForIdle();
- checkScrollPane(true);
+ checkScrollPane(true, false);
// vertical scroll bar is enabled + shift
initScrollPane(true, false);
@@ -82,14 +92,14 @@
robot.mouseWheel(delta);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.waitForIdle();
- checkScrollPane(true);
+ checkScrollPane(false, false);
// horizontal scroll bar is enabled
initScrollPane(false, true);
robot.waitForIdle();
robot.mouseWheel(delta);
robot.waitForIdle();
- checkScrollPane(false);
+ checkScrollPane(false, true);
// horizontal scroll bar is enabled + shift
initScrollPane(false, true);
@@ -98,14 +108,14 @@
robot.mouseWheel(delta);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.waitForIdle();
- checkScrollPane(false);
+ checkScrollPane(false, true);
// both scroll bars are enabled
initScrollPane(true, true);
robot.waitForIdle();
robot.mouseWheel(delta);
robot.waitForIdle();
- checkScrollPane(true);
+ checkScrollPane(true, false);
// both scroll bars are enabled + shift
initScrollPane(true, true);
@@ -114,7 +124,7 @@
robot.mouseWheel(delta);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.waitForIdle();
- checkScrollPane(false);
+ checkScrollPane(false, true);
}
static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
@@ -129,17 +139,25 @@
});
}
- static void checkScrollPane(boolean verticalScrolled) throws Exception {
+ static void checkScrollPane(boolean verticalScrolled,
+ boolean horizontalScrolled) throws Exception {
SwingUtilities.invokeAndWait(() -> {
if (verticalScrolled) {
- if (scrollPane.getVerticalScrollBar().getValue() == 0
- || scrollPane.getHorizontalScrollBar().getValue() != 0) {
+ if (scrollPane.getVerticalScrollBar().getValue() == 0) {
throw new RuntimeException("Wrong vertical scrolling!");
}
+ } else{
+ if (scrollPane.getVerticalScrollBar().getValue() != 0) {
+ throw new RuntimeException("Wrong vertical scrolling!");
+ }
+ }
+ if (horizontalScrolled) {
+ if (scrollPane.getHorizontalScrollBar().getValue() == 0) {
+ throw new RuntimeException("Wrong horizontal scrolling!");
+ }
} else {
- if (scrollPane.getVerticalScrollBar().getValue() != 0
- || scrollPane.getHorizontalScrollBar().getValue() == 0) {
+ if (scrollPane.getHorizontalScrollBar().getValue() != 0) {
throw new RuntimeException("Wrong horizontal scrolling!");
}
}
@@ -147,9 +165,10 @@
}
static void createAndShowGUI() {
- JFrame frame = new JFrame();
+ frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
+ frame.setLocationRelativeTo(null);
textArea = new JTextArea("Hello World!");
scrollPane = new JScrollPane(textArea);
JPanel panel = new JPanel(new BorderLayout());