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

DefaultKeyboardFocusManager and component key binding

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 6
    • client-libs
    • x86
    • windows_xp

      FULL PRODUCT VERSION :
      java version "1.6.0-rc"
      Java(TM) SE Runtime Environment (build 1.6.0-rc-b91)
      Java HotSpot(TM) Client VM (build 1.6.0-rc-b91, mixed mode)

      A DESCRIPTION OF THE PROBLEM :
      Our customers are facing this problems from long time and it is worsen in jdk1.6
      We have implemented shortcut keys using component key binding. i.e. using actionmap and keymap
       I have a key binding on JPanel fo key KeyEvent.VK_I and on this key I display JTEXTFIELD on same JPANEL.
      I also have a key binding on this same JPANEL for key KeyEvent.VK_ESCAPE and on this key I remove this JTEXTFIELD from JPANEL.
      Now if you go on pressing key "i" and "escape" one by one for few times then sometimes suddenly "i" is displayed inside JTextField.

      I looked into this problem and found that when you press key "i" then three event are generated in sequence : KEY_PRESSED,KEY_TYPED,KEY_RELEASED for key "i".

      So I think sometimes JTEXTFIELD gets displayed and after that KEY_TYPED event is fired, so I gets displayed inside JTEXTFIELD.



      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      As "i" is shortcut key it should not get displayed. Also suppose if user types "iamol" very fast on Japnel, then as "i" is used for keybinding action JTEXTFIELD should display "amol".

      ---------- BEGIN SOURCE ----------
      import java.awt.Container;
      import java.awt.event.ActionEvent;
      import java.awt.event.KeyEvent;

      import javax.swing.AbstractAction;
      import javax.swing.ActionMap;
      import javax.swing.InputMap;
      import javax.swing.JComponent;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      import javax.swing.KeyStroke;

      public class KeyTest3 {
      private final JFrame frame;
      private final JPanel framePanel;
      private final JLabel infoLabel;
      private final JTextField infoTextField;

      public KeyTest3(){
      frame = new JFrame("KeyTest3");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      framePanel = new JPanel();
      infoLabel = new JLabel("press i .....");
      infoTextField = new JTextField(8);
      Container frameContainer = frame.getContentPane();

      InputMap keyMap = new InputMap();
      keyMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0), "insert");
      keyMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");

      ActionMap actionMap = new ActionMap();
      actionMap.put("insert", new AbstractAction(){
      public void actionPerformed(ActionEvent e) {
      dataentryMode();
      }
      });

      actionMap.put("escape", new AbstractAction(){
      public void actionPerformed(ActionEvent e) {
      listMode();
      }
      });


      framePanel.setInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,keyMap);
      framePanel.setActionMap(actionMap);

      listMode();
      frameContainer.add(framePanel);
      frame.setSize(300,200);
      frame.setVisible(true);
      infoLabel.requestFocus();
      }

      public final void listMode(){
      framePanel.removeAll();
      framePanel.add(infoLabel);
      framePanel.revalidate();
      framePanel.repaint();
      infoLabel.requestFocus();
      }

      public final void dataentryMode() {
      try {
      Thread.sleep(200);
      framePanel.removeAll();
      framePanel.add(infoTextField);
      framePanel.revalidate();
      framePanel.repaint();
      infoTextField.requestFocus();
      }catch(InterruptedException iex){
      iex.printStackTrace();
      }
      }




      public static void main(String args[]) {
      new KeyTest3();
      }


      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      I have done the changes in DefaultKeyBoardFocusManager.dispatchKeyEvent() wherein I ignore the KEY_TYPED event just after the shortcutkey action. But this workaround is very specific to my application. Can you suggest a better one ?

            Unassigned Unassigned
            rmandalasunw Ranjith Mandala (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: