2013-04-01 2 views
0

Я продолжаю видеть, что вместо KeyListeners я должен использовать Key Bindings. Поэтому я нашел эту страницу: Key Bindings. Я прочитал его и попытался его реализовать.Java KeyBindings: Как это работает?

Action numPressed = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("hi"); 
     } 
    }; 
    this.getInputMap().put(KeyStroke.getKeyStroke("1"), "released"); 
    this.getActionMap().put("released", numPressed); 

Я решил просто посмотреть, что произойдет. Класс, в котором он находится, расширяет JPanel. Раньше я использовал this.setFocusable(true). Однако я ничего не вижу, когда я печатаю «1». Что я делаю не так? Как должны выполняться ключевые привязки?

ответ

3

Ваш пример будет работать только в том случае, если панель имеет фокус, попробуйте вместо этого использовать getInputMap(WHEN_IN_FOCUSED_WINDOW).

Вы также можете обнаружить, что ваш KeyStroke заявление не будет работать, я бы предложил попробовать использовать KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true) вместо этого, который предоставит вам KeyStroke объект, который будет реагировать на ключевые релизы.

Обновленный с примером

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestKeyBindings04 { 

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

    public TestKeyBindings04() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      ActionMap am = getActionMap(); 

      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, false), "pressed"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true), "released"); 

      am.put("pressed", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Pressed"); 
       } 
      }); 

      am.put("released", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("released"); 
       } 
      }); 

      setFocusable(true); 
      requestFocusInWindow();   
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     } 
    } 
} 
+0

Ok, но я уже использовал метод 'setFocusable (истина)'. Разве это не даст фокус панели? – Justin

+0

Я пробовал это, кажется, не работает – Justin

+0

@gangqinlaohu Когда я подключил этот код в Eclipse, он сказал мне, что мне нужно переопределить 'actionPerformed'. Может быть, это сработает. – syb0rg

Смежные вопросы