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

[macosx] Holding modifiable key ( A, S etc ) down when focus is not on JTextField stops JTextField accepting text

    XMLWordPrintable

Details

    Description

      FULL PRODUCT VERSION :
      java -version
      java version "1.8.0_121"
      Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
      Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Fails with Mac OS X 10.12.4 x86_64 ( Java version 1.8.0_121 )
      Fails with Mac OS X 10.12.4 x86_64 ( Java version: 1.8.0_111 )
      Works with Mac OS X 10.11.6 x86_64 ( Java version: 1.8.0_111 )

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      Running on: Mac OS X 10.12.4 x86_64
      Date: Mon Apr 10 22:03:38 BST 2017
      Maximum heap size: 3.186GB
      Java version: 1.8.0_121

      Hardware Overview:
      Model Name: MacBook Pro
      Model Identifier: MacBookPro11,1
      Processor Name: Intel Core i5
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 3 MB
      Memory: 8 GB
      Boot ROM Version: MBP111.0138.B25
      SMC Version (system): 2.16f68
      Serial Number (system): C02NCCVDG3QH
      Hardware UUID: 9DAF32AE-2870-5834-9682-1FF759216934

      Graphics/Displays:
      Intel Iris:
      Chipset Model: Intel Iris
      Type: GPU
      Bus: Built-In
      VRAM (Dynamic, Max): 1536 MB
      Vendor: Intel (0x8086)
      Device ID: 0x0a2e
      Revision ID: 0x0009
      Metal: Supported
      Displays:
      Color LCD:
      Display Type: Built-In Retina LCD
      Resolution: 2560 x 1600 Retina
      Pixel Depth: 32-Bit Color (ARGB8888)
      Main Display: Yes
      Mirror: Off
      Online: Yes
      Rotation: Supported
      Automatically Adjust Brightness: Yes
      Connection Type: DisplayPort

      A DESCRIPTION OF THE PROBLEM :
      If one runs up a swing ui programme on a Mac with the above OS and Java version, then click on a button, then hold down a A or S ( i.e. modifiable key ) for 3 seconds, nothing appears to happen. Then click in a JTextField and try and enter any text and it will not let you.

      However if you run up the application, and click in the text field first and then hold down say key A then all work normally, and even if one then clicks on a button and then holds down the A key for 3 seconds everything will work normally from then on.

      REGRESSION. Last worked in version 8u111

      ADDITIONAL REGRESSION INFORMATION:
      Fails with Mac OS X 10.12.4 x86_64 ( Java version 1.8.0_121 )
      Fails with Mac OS X 10.12.4 x86_64 ( Java version: 1.8.0_111 )
      Works with Mac OS X 10.11.6 x86_64 ( Java version: 1.8.0_111 )

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Make a swing ui with a button and JTextField ( HoldKeyTest.java pasted in below )
      2 Run programme up
      3 Click once on the button so it has the focus
      4. Hold a modifiable key down ( say A ) for 3 seconds
      5. Now click in the text field and try and type anything, it won't let you.

      This only happens if step 1 is done when the programme if first run up, e.g. if you click in the JTextField first hold down A then the popup of choices will appears and all will work normally even if one then does the steps 1-5 above.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      One would expect to always type text into a text field regardless if one held down a key when a button had the focus.
      ACTUAL -
      Am not able to type new text into any text field.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      No errors reported

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /*
       * Example code to show holding down key issue
       */
      package examples;

      import java.awt.AWTException;
      import java.awt.Component;
      import java.awt.Dimension;
      import java.awt.Point;
      import java.awt.Robot;
      import java.awt.event.ComponentAdapter;
      import java.awt.event.ComponentEvent;
      import java.awt.event.ComponentListener;
      import java.awt.event.KeyEvent;
      import javax.swing.JFrame;

      public class HoldKeyTest extends javax.swing.JFrame {

        /**
         * Creates new form Find
         */
        public HoldKeyTest() {
          initComponents();

        }
        
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
        private void initComponents() {

          jLabel1 = new javax.swing.JLabel();
          jTextField1 = new javax.swing.JTextField();
          jButton1 = new javax.swing.JButton();

          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          setTitle("Find");

          jLabel1.setText("Click on button, then hold modifiable key eg A,S... for 2 seconds, then attemp type in text box :");

          jButton1.setText("Button");
          jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
              jButton1ActionPerformed(evt);
            }
          });

          org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
          getContentPane().setLayout(layout);
          layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
              .addContainerGap()
              .add(jLabel1)
              .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
              .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 138, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
              .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 146, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
              .addContainerGap())
          );
          layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
              .addContainerGap()
              .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(jLabel1)
                .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(jButton1))
              .addContainerGap(54, Short.MAX_VALUE))
          );

          pack();
        }// </editor-fold>//GEN-END:initComponents

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
          // TODO add your handling code here:
        }//GEN-LAST:event_jButton1ActionPerformed

        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {

          try {
            javax.swing.UIManager.LookAndFeelInfo[] installedLookAndFeels = javax.swing.UIManager.getInstalledLookAndFeels();
            for (int idx = 0; idx < installedLookAndFeels.length; idx++) {
              if ("Nimbus".equals(installedLookAndFeels[idx].getName())) {
                javax.swing.UIManager.setLookAndFeel(installedLookAndFeels[idx].getClassName());
                break;
              }
            }
          } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          }


          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
              new HoldKeyTest().setVisible(true);
            }
          });
        }

       


        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JTextField jTextField1;
        // End of variables declaration//GEN-END:variables

      }
      /*
       * Example code to show holding down key issue
       */
      package examples;

      import java.awt.AWTException;
      import java.awt.Component;
      import java.awt.Dimension;
      import java.awt.Point;
      import java.awt.Robot;
      import java.awt.event.ComponentAdapter;
      import java.awt.event.ComponentEvent;
      import java.awt.event.ComponentListener;
      import java.awt.event.KeyEvent;
      import javax.swing.JFrame;

      public class HoldKeyTest extends javax.swing.JFrame {

        /**
         * Creates new form Find
         */
        public HoldKeyTest() {
          initComponents();

        }
        
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
        private void initComponents() {

          jLabel1 = new javax.swing.JLabel();
          jTextField1 = new javax.swing.JTextField();
          jButton1 = new javax.swing.JButton();

          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          setTitle("Find");

          jLabel1.setText("Click on button, then hold modifiable key eg A,S... for 2 seconds, then attemp type in text box :");

          jButton1.setText("Button");
          jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
              jButton1ActionPerformed(evt);
            }
          });

          org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
          getContentPane().setLayout(layout);
          layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
              .addContainerGap()
              .add(jLabel1)
              .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
              .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 138, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
              .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 146, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
              .addContainerGap())
          );
          layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
              .addContainerGap()
              .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(jLabel1)
                .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(jButton1))
              .addContainerGap(54, Short.MAX_VALUE))
          );

          pack();
        }// </editor-fold>//GEN-END:initComponents

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
          // TODO add your handling code here:
        }//GEN-LAST:event_jButton1ActionPerformed

        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {

          try {
            javax.swing.UIManager.LookAndFeelInfo[] installedLookAndFeels = javax.swing.UIManager.getInstalledLookAndFeels();
            for (int idx = 0; idx < installedLookAndFeels.length; idx++) {
              if ("Nimbus".equals(installedLookAndFeels[idx].getName())) {
                javax.swing.UIManager.setLookAndFeel(installedLookAndFeels[idx].getClassName());
                break;
              }
            }
          } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(HoldKeyTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          }


          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
              new HoldKeyTest().setVisible(true);
            }
          });
        }

       


        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JTextField jTextField1;
        // End of variables declaration//GEN-END:variables

      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      I tried to use the Robot class to force a A keyHold down in a JTextField on startup of programme but this did not cure the problem.

      Attachments

        Activity

          People

            aniyogi Avik Niyogi (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: