2013-04-01 3 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'을 입력해도 아무 것도 나타나지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? Key Bindings는 어떻게 구현되어야 하는가?

답변

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

좋아 예와 업데이트,하지만 난 이미 방법'위해서 setFocusable'(true)를 사용했다. 패널에 초점을 맞추지 않겠습니까? – Justin

+0

시도해 보았습니다. 작동하지 않는 것 같습니다. – Justin

+0

@gangqinlaohu Eclipse에이 코드를 삽입하면 actionPerformed를 덮어 써야한다고했습니다. 어쩌면 그렇게 될 것입니다. – syb0rg

관련 문제