2012-08-03 3 views
2

내 문제는 프레임 화면의 공간을 클릭하면 등록 된 키보드 키가 멈추어 져서 플레이어가 움직이지 않는 것입니다.JFrame 마우스 클릭 키보드 멈춤 키보드 버튼

도움을 미리 감사드립니다.

코드 :

private Component comp; 
.... 

public InputManager(Component comp) { 
    this.comp = comp; 
    mouseLocation = new Point(); 
    centerLocation = new Point(); 

    // register key and mouse listeners 
    comp.addKeyListener(this); 
    comp.addMouseListener(this); 
    comp.addMouseMotionListener(this); 
    comp.addMouseWheelListener(this); 

    // allow input of the TAB key and other keys normally 
    // used for focus traversal 
    comp.setFocusTraversalKeysEnabled(false); 
} 

GUI 코드 :

Game game = new Game(); 
    game.setMinimumSize(new Dimension(WIDTH * 2, HEIGHT * 2)); 
    game.setPreferredSize(new Dimension(WIDTH * 2, HEIGHT * 2)); 
    game.setMaximumSize(new Dimension(WIDTH * 2, HEIGHT * 2)); 

    frame = new JFrame(Game.NAME); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 
    frame.add(game); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    game.start(); 

답변

9

난 당신이 키 입력을 수신하는 모든 KeyListener를 사용한다고 가정합니다. 이것은 컴포넌트가 포커스를 듣고있을 때만 작동하며, JFrame에서 마우스를 누르면 컴포넌트를 듣는 것이 포커스를 잃을 가능성이 있습니다.

이 솔루션은 KeyListener를 사용하지 않고 대신 KeyListener 및 상위 레벨 개념보다 강력한 Key Bindings을 사용합니다.

또한 을 수신기로 사용하는 것을 중지하고 싶습니다. 프로그램이 장난감 프로그램 이상으로 커지면 자체 리스너로 사용되는 GUI 클래스를 유지하기가 매우 어려워집니다.

또한 "오 그래 Game.java extends Canvas": AWT와 Swing 구성 요소를 불필요하게 혼합하지 않으므로 부작용이 발생할 수 있습니다. 대신 Canvases 대신 JPanels와 같은 모든 Swing 구성 요소를 사용하십시오.

+2

+1 키 바인딩 용. +1을 리스너로 사용 중지하고 혼합 발언을 +1하십시오. 흠, 크레딧을주기 위해 두 개의 다른 포스트를 upvote해야합니까? – Robin

+0

감사합니다. 덕분에 많은 도움이되었습니다. 나는 확실히 열쇠 바인딩을 시도 할 것이다. – DCSoft

+0

임시 해결책을 찾았습니다. 게임 클래스를 JFrame 대신 InputManager 클래스에 전달했습니다. – DCSoft