Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8262840

[macos10.15] mouse wheel event incorrectly reports shift being down

XMLWordPrintable

    • x86_64
    • os_x

      ADDITIONAL SYSTEM INFORMATION :
      openjdk version "15.0.2" 2021-01-19
      OpenJDK Runtime Environment (build 15.0.2+7-27)
      OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)

      Macbook Pro (13-inch, M1, 2020)

      Big Sur
      Version 11.2

      A DESCRIPTION OF THE PROBLEM :
      On a macbook pro, M1. When using the two finger gesture to scroll, occasionally the shift key will be reported as down.

      REGRESSION : Last worked in version 8

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Simply run the MouseWheelEventDemo as modified here-in and observe the 'modifiers' output.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The modifiers variable should never be non-zero.
      ACTUAL -
      Occasionally it is.

      ---------- BEGIN SOURCE ----------
      package utilities;

      /*
       * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
       *
       * Redistribution and use in source and binary forms, with or without
       * modification, are permitted provided that the following conditions
       * are met:
       *
       * - Redistributions of source code must retain the above copyright
       * notice, this list of conditions and the following disclaimer.
       *
       * - Redistributions in binary form must reproduce the above copyright
       * notice, this list of conditions and the following disclaimer in the
       * documentation and/or other materials provided with the distribution.
       *
       * - Neither the name of Oracle or the names of its
       * contributors may be used to endorse or promote products derived
       * from this software without specific prior written permission.
       *
       * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       */

      /*
      * MouseWheelEventDemo.java
      */

      import java.awt.BorderLayout;
      import java.awt.Dimension;
      import java.awt.event.MouseWheelEvent;
      import java.awt.event.MouseWheelListener;

      import javax.swing.*;

      public class MouseWheelEventDemo extends JPanel
              implements MouseWheelListener {
          JTextArea textArea;
          JScrollPane scrollPane;
          static final String NEWLINE = System.getProperty("line.separator");
          
          public static void main(String[] args) {
              /* Use an appropriate Look and Feel */
              try {
                  //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                  //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
                  UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
              } catch (UnsupportedLookAndFeelException ex) {
                  ex.printStackTrace();
              } catch (IllegalAccessException ex) {
                  ex.printStackTrace();
              } catch (InstantiationException ex) {
                  ex.printStackTrace();
              } catch (ClassNotFoundException ex) {
                  ex.printStackTrace();
              }
              /* Turn off metal's use of bold fonts */
              UIManager.put("swing.boldMetal", Boolean.FALSE);
              
              //Schedule a job for the event dispatch thread:
              //creating and showing this application's GUI.
              javax.swing.SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                      createAndShowGUI();
                  }
              });
          }
          
          /**
           * Create the GUI and show it. For thread safety,
           * this method should be invoked from the
           * event dispatch thread.
           */
          private static void createAndShowGUI() {
              //Create and set up the window.
              JFrame frame = new JFrame("MouseWheelEventDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              
              //Create and set up the content pane.
              JComponent newContentPane = new MouseWheelEventDemo();
              newContentPane.setOpaque(true); //content panes must be opaque
              frame.setContentPane(newContentPane);
              
              //Display the window.
              frame.pack();
              frame.setVisible(true);
          }
          
          public MouseWheelEventDemo() {
              super(new BorderLayout());
              
              textArea = new JTextArea();
              textArea.setEditable(false);
              scrollPane = new JScrollPane(textArea);
              scrollPane.setVerticalScrollBarPolicy(
                      JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
              scrollPane.setPreferredSize(new Dimension(400, 250));
              add(scrollPane, BorderLayout.CENTER);
              textArea.append("This text area displays information "
                      + "about its mouse wheel events."
                      + NEWLINE);
              
              //Register for mouse-wheel events on the text area.
              textArea.addMouseWheelListener(this);
              
              setPreferredSize(new Dimension(450, 350));
              setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
          }
          
          //Append to the text area and make sure the new text is visible.
          void eventOutput(String eventDescription, MouseWheelEvent e) {
              textArea.append(e.getComponent().getClass().getName()
              + ": "
                      + eventDescription);
              textArea.setCaretPosition(textArea.getDocument().getLength());
          }
          
          public void mouseWheelMoved(MouseWheelEvent e) {
              String message;
              int notches = e.getWheelRotation();

              if (notches < 0) {
                  message = "Mouse wheel moved UP "
                          + -notches + " notch(es)" + NEWLINE;
              } else {
                  message = "Mouse wheel moved DOWN "
                          + notches + " notch(es)" + NEWLINE;
              }
              if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
                  message += " Scroll type: WHEEL_UNIT_SCROLL" + NEWLINE;
                  message += " Scroll amount: " + e.getScrollAmount()
                  + " unit increments per notch" + NEWLINE;
                  message += " Units to scroll: " + e.getUnitsToScroll()
                  + " unit increments" + NEWLINE;
                  message += " Vertical unit increment: "
                          + scrollPane.getVerticalScrollBar().getUnitIncrement(1)
                          + " pixels" + NEWLINE;
              } else { //scroll type == MouseWheelEvent.WHEEL_BLOCK_SCROLL
                  message += " Scroll type: WHEEL_BLOCK_SCROLL" + NEWLINE;
                  message += " Vertical block increment: "
                          + scrollPane.getVerticalScrollBar().getBlockIncrement(1)
                          + " pixels" + NEWLINE;
              }
              int modifiers = e.getModifiersEx();
              if (modifiers != 0) {
                  String modifiersText = MouseWheelEvent.getModifiersExText(modifiers);
                  message += " modifiers "+modifiers+" " +modifiersText + NEWLINE;
              }
              message += NEWLINE;
              eventOutput(message, e);
          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      none i've found.

      FREQUENCY : often


            serb Sergey Bylokhov
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: