2010-11-22 9 views
3

Par conditions d'accessibilité, Shift + F10 est supposé ouvrir les menus contextuels du clic droit.Java Swing Shift + F10 Accessibilité

Dans Swing, une approche consiste simplement à ajouter la liaison de touche à chaque composant que vous créez. Cependant, j'ai expérimenté avec extension de l'EventQueue pour gérer tous les presses Shift + F10. En particulier, j'ai surchargé dispatchEvent (AWTEvent) pour convertir Maj +F10 KeyEvents dans de clic droit mousePresses:

protected void dispatchEvent(AWTEvent event) { 
    if (event instanceof KeyEvent) { 
     KeyEvent ev = (KeyEvent) event; 
     if ((ev.getKeyCode() == KeyEvent.VK_F10) && 
        (ev.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) > 0) { 
      KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
      Component comp = kfm.getFocusOwner(); 
      Point mouse = MouseInfo.getPointerInfo().getLocation(); 
      SwingUtilities.convertPointFromScreen(mouse, comp); 

      eventToDispatch = new MouseEvent(comp, 
          MouseEvent.MOUSE_RELEASED, ev.getWhen(), 0, mouse.x, mouse.y, 
          1, true); 
     } 
    } 
} 

Cependant, cela empêche Maj +F10 de pouvoir fermer tout JPopupMenus lancé. Toute idée si cette solution est réalisable, ou existe-t-il de meilleures façons de répondre à cette exigence?

Répondre

0
ActionListener actionListener = new ActionListener() { 
     public void actionPerformed(ActionEvent actionEvent) { 
     try { 
      int dotPosition = textField.getCaretPosition(); 
      Rectangle popupLocation = textField 
       .modelToView(dotPosition); 
      popup.show(textField, popupLocation.x, popupLocation.y); 
     } catch (BadLocationException badLocationException) { 
      System.out.println("Oops"); 
     } 
     } 
    }; 
    KeyStroke keystroke = KeyStroke.getKeyStroke(KeyEvent.VK_F10, 
     InputEvent.SHIFT_MASK); 
    textField.registerKeyboardAction(actionListener, keystroke, 
     JComponent.WHEN_FOCUSED); 
+0

Je savais déjà que je pouvais enregistrer l'action du clavier pour chaque composant. Cependant, notre application est grande. En conséquence, de nombreux composants gèrent déjà les déclencheurs contextuels de la souris. C'est pourquoi je cherche à le faire en capturant toutes les presses Shift + F10 dans l'EventQueue. – Huey