2013-08-01 3 views
7

JPanel에서 Java로 키 바인딩을 만들려고합니다. 'w'버튼을 누르면 특정 동작이 실행되기를 원합니다. 바인딩을 만들 때 Java 자습서를 따르지만 actionPerformed 메서드는 실행되지 않습니다 (즉, 텍스트가 인쇄되지 않음). 다음은 내 테스트 GUI의 코드 전체이며 해당 부분이 강조 표시되어 있습니다.Java 키 바인딩이 작동하지 않습니다.

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

@SuppressWarnings("serial") 
public class Test extends JFrame{ 

private JPanel panel; 

public Test(){ 
    super(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500,500); 
    setLayout(new BorderLayout()); 
    setVisible(true);   
    panel = new JPanel(); 

    // HERE ARE THE KEY BINDINGS 
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward"); 
    panel.getActionMap().put("forward", new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("test"); 
     } 
    }); 
    // END OF KEY BINDINGS 

    add(panel, BorderLayout.CENTER); 
} 

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

} 

텍스트 "test"는 절대로 인쇄되지 않습니다. 많은 변형과 다른 키들로 여러 번 시도해 보았습니다. 패널에 초점이 맞춰 졌는지 확인했지만 운이 없었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

13

문제는 KeyStroke을 찾는 방법입니다. KeyStroke.getKeyStroke('w')typed w을 반환합니다. 이는 어떤 이유로 키 이벤트를 트리거하지 않습니다. 이것이 내가이 방법을 피하는 경향이있는 이유입니다. 대신

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward"); 

또는

또한
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward"); 

, 당신은 안전 할 것인가

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)... 

같은 초점 InputMap에 대한 제약, 뭔가를 정의 할 수 있습니다 사용 ...하지만 당신이 필요합니다 키 스트로크를 어느 수준에서 트리거 할 것인지를 결정하려면

을 참조하십시오. 당신은`w'`을 사용하고 통지를하지 않았다

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test extends JFrame { 

    private JPanel panel; 

    public Test() { 
     super(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 500); 
     setLayout(new BorderLayout()); 
     setVisible(true); 
     panel = new JPanel(); 

     // HERE ARE THE KEY BINDINGS 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward"); 
     panel.getActionMap().put("forward", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("test"); 
      } 
     }); 
     // END OF KEY BINDINGS 

     add(panel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       new Test(); 
      } 
     }); 
    } 
} 
+0

예를으로 업데이트 자세한 내용

에 대한및 How to use Key Bindings, 당신은' "W"'사용하고 생각했다. 실제 예제로 업데이트 – MadProgrammer