2016-06-06 6 views
0

키 입력이 필요한 저수준 게임을 만드는 중입니다. 그래서 평소처럼 KeyListenerKeyEvent 라이브러리를 가져 왔습니다. 나는 세 가지 필수 방법을 만들었습니다 : keyPressed, keyReleased, keyTyped. 그런 다음 keyListener 클래스를 "testJPanel"클래스에 추가하고 keyPressed 메서드에서 switch을 만들어 특정 버튼이 눌려 졌는지 여부를 확인했습니다. keyReleasedkeyTyped 방법에 대해서는 빈/빈칸으로 남겨 두었습니다. 내게는 모든 것이 멋지게 멋지지만, Java은 키보드 입력을 등록하지 않는 것 같습니다. 위쪽 화살표 키를 누르면 프로그램이 "Test"를 인쇄해야하지만 슬프게도 그렇지 않습니다. 왜 그거야? 모든 도움을 주시면 감사하겠습니다.KeyListener의 입력을 인식하지 못했습니다.

testJFrame.java

import java.awt.Color; 

import javax.swing.JFrame; 

public class testJFrame extends JFrame { 

    public testJFrame() { 
     setTitle("A test application"); 
     setSize(500, 500); 
     setBackground(Color.black); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setFocusable(true); 

     add(new testJPanel()); 
    } 

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

} 

testJPanel.java

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class testJPanel extends JPanel implements KeyListener, ActionListener { 

    public testJPanel() { 
     Timer timer = new Timer(15, this); 
     timer.start(); 
     addKeyListener(this); 
    } 

    public void update() { 
    } 

    @Override 
    public void actionPerformed(ActionEvent a) { 
     update(); 
    } 

    @Override 
    public void keyPressed(KeyEvent k) { 
     switch(k.getKeyCode()) { 
     case KeyEvent.VK_UP: 
      System.out.println("Test"); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent k) { 
    } 

    @Override 
    public void keyTyped(KeyEvent k) { 
    } 

} 

답변

0

귀하의 패널이 포커스이어야하고 KeyEvent를 받아 봐하기 위해 초점을 가지고있다. 당신의 패널 생성자에

setFocusable(true);

을 추가하고 패널을 추가 한 후 호출해야합니다()이

testPanel = new testJPanel(); 
add(testPanel); 
testPanel.requestFocusInWindow(); 

requestFocusInWindow를 같이 당신의 testFrame 생성자를 변경합니다. 또한

testPanel.setFocusable(true); 
testPanel.requestFocusInWindow(); 

을 당신은 단지 모든 KeyListener에서의 keyPressed 방법()를 사용할 경우 :

1

당신은 JPanel에 초점을 맞출 수 있도록해야합니다. 대신 KeyAdapter 클래스를 사용할 수 있습니다.

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class TestJFrame extends JFrame { 

    public TestJFrame() { 

     setTitle("A test application"); 
     setPreferredSize(new Dimension(500, 500)); 
     setBackground(Color.black); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     JPanel testPanel = new JPanel(); 
     testPanel.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent e) { 
       super.keyPressed(e); 
       switch(e.getKeyCode()) { 
        case KeyEvent.VK_UP: 
         System.out.println("Test"); 
       } 
      } 
     }); 
     add(testPanel); 
     testPanel.setFocusable(true); 
     testPanel.requestFocusInWindow(); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestJFrame(); 
    } 
} 
관련 문제