سؤال

وأود أن إنشاء تطبيق على نطاق اختصار لوحة المفاتيح من أجل جافا سوينغ التطبيق.حلقات أكثر من جميع العناصر و إضافة اختصار على كل التركيز الآثار الجانبية ذات الصلة ، يبدو وكأنه حل القوة الغاشمة.

أي شخص لديه نظافة الحل ؟

هل كانت مفيدة؟

المحلول

تثبيت مخصص KeyEventDispatcher.على KeyboardFocusManager الدرجة هو أيضا مكان جيد للحصول على هذه الوظيفة.

KeyEventDispatcher

نصائح أخرى

لكل نافذة ، استخدام JComponent.registerKeyboardAction مع شرط WHEN_IN_FOCUSED_WINDOW.بدلا من ذلك استخدام:

JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(keyStroke, command);
JComponent.getActionMap().put(command,action);

كما هو موضح في registerKeyboardAction API مستندات.

على الناس يتساءلون (مثلي) كيفية استخدام KeyEventDispatcher هنا هو مثال على أن أضع معا.ويستخدم HashMap لتخزين جميع الإجراءات العالمية, لأنني لا أحب الكبيرة if (key == ..) then .. else if (key == ..) then .. else if (key ==..) .. يبني.

/** map containing all global actions */
private HashMap<KeyStroke, Action> actionMap = new HashMap<KeyStroke, Action>();

/** call this somewhere in your GUI construction */
private void setup() {
  KeyStroke key1 = KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK);
  actionMap.put(key1, new AbstractAction("action1") {
    @Override
    public void actionPerformed(ActionEvent e) {
      System.out.println("Ctrl-A pressed: " + e);
    }
  });
  // add more actions..

  KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
  kfm.addKeyEventDispatcher( new KeyEventDispatcher() {

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
      KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e);
      if ( actionMap.containsKey(keyStroke) ) {
        final Action a = actionMap.get(keyStroke);
        final ActionEvent ae = new ActionEvent(e.getSource(), e.getID(), null );
        SwingUtilities.invokeLater( new Runnable() {
          @Override
          public void run() {
            a.actionPerformed(ae);
          }
        } ); 
        return true;
      }
      return false;
    }
  });
}

استخدام SwingUtils.invokeLater() هو ربما ليس ضروري, ولكن ربما يكون فكرة جيدة ليس كتلة الحدث العالمي حلقة.

عندما يكون لديك القائمة ، يمكنك إضافة العالمية اختصارات لوحة المفاتيح إلى عناصر القائمة:

    JMenuItem item = new JMenuItem(action);
    KeyStroke key = KeyStroke.getKeyStroke(
        KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK);
    item.setAccelerator(key);
    menu.add(item);

قليلا المثال المبسط:

KeyboardFocusManager keyManager;

keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyManager.addKeyEventDispatcher(new KeyEventDispatcher() {

  @Override
  public boolean dispatchKeyEvent(KeyEvent e) {
    if(e.getID()==KeyEvent.KEY_PRESSED && e.getKeyCode()==27){
      System.out.println("Esc");
      return true;
    }
    return false;
  }

});

استخدام الجزء التالي من التعليمات البرمجية

ActionListener a=new ActionListener(){
   public void actionPerformed(ActionEvent ae)
   {
    // your code
   }
};
getRootPane().registerKeyboardAction(a,KeyStroke.getKeyStroke("ctrl D"),JComponent.WHEN_IN_FOCUSED_WINDOW);

استبدال "ctrl D" مع الاختصار الذي تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top