2013-09-29 5 views
0

저는 키보드에서 사용자 입력을받는 JFrame 창이있는 프로그램을 실행하려고합니다. 따라서 사용자가 단어를 입력하면 명령문 클래스는 단어가 들어 있는지 확인한 다음 인쇄해야합니다.Java KeyListener가 작동하지 않습니다.

지금은 키보드 클래스를 작동하도록 명령문 클래스를 가져올 수 없습니다. 키보드 입력을 얻으려면이 방법을 사용하고 싶지 않습니다. 사람들이 화를내는 더 좋은 방법을 알고 있습니다.

문제점 : 문 클래스가 키보드 입력을 받도록 수정했습니다.

public class Statements { 

Keyboard input; 

public Statements(Keyboard input){ 
    this.input = input; 
} 

public void tick() { 

    if(input.up){ 
     System.out.println("inventory"); 
    } 
} 

이것은 당신이 키보드의 모든 문자를 사용하려면 키 수신기를 만드는 나쁜 방법, 키보드 클래스입니다 :

는 문 클래스입니다. 하지만 내가 아는 유일한 방법이야.

public class Keyboard implements KeyListener { 

private boolean[] keys = new boolean[200]; 
public boolean up, down, left, right, i; 

public void update(){ 
    up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W]; 
    down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; 
    left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; 
    right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D]; 
    //all the char on the keyboard 
    ... 
    ... 
    i = keys[KeyEvent.VK_I]; 
} 

public void keyPressed(KeyEvent e) { 
    keys[e.getKeyCode()] = true; 
} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
} 

public void keyTyped(KeyEvent e) { 

} 

} 

당신은 모든 당신이 그것을 작동하도록 JFrame의에 사용되는 구성 요소뿐만 아니라

setFocusable(true);KeyListener를 추가 할 필요가

private static final long serialVersionUID = 1L; 

public static final int WIDTH = 100; 
public static final int HEIGHT = WIDTH/16 * 9; 
public static final int SCALE = 3; 

private boolean running = false; 

private Thread thread; 
private JFrame frame; 
private Keyboard key; 
private Statments stat; 

public Main() { 
    Dimension size = new Dimension(WIDTH * SCALE, HEIGHT * SCALE); 
    setPreferredSize(size); 

    frame = new JFrame(); 
    key = new Keyboard(); 
    stat = new Statments(key); 

    addKeyListener(key); 


} 

public synchronized void start() { 
    running = true; 
    thread = new Thread(this, "Display"); 
    thread.start(); 
} 

public synchronized void stop() { 
    running = false; 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while (running) { 
     frame.requestFocus(); 
     tick(); 
    } 
    stop(); 
} 

public void tick(){ 
    key.update(); 
    stat.tick(); 
} 

public static void main(String args[]) { 
    Main main = new Main(); 
    main.frame.setResizable(false); 
    main.frame.setTitle("game"); 
    main.frame.add(main); 
    main.frame.pack(); 
    main.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.frame.setLocationRelativeTo(null); 
    main.frame.setVisible(true); 

    main.start(); 
} 

} 

답변

1

메인 클래스입니다. 그러나 당신이 좋아, JFrameKeyListener를 추가 지정 KeyEventDispatcher을 만들고 KeyboardFocusManager에 등록하려는 경우

:

KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
kfm.addKeyEventDispatcher(new MyKeyEventDispatcher()); 

(나는 JPanel를 사용하여 모든 구성 요소를 추가 할 수 JPanel 대신 JFrame에)

+0

나에게는 JPanels에서만 작동한다. 'JFrame'은'JPanel'의 컨테이너/래퍼입니다. 나는 JPanel에'setFocusable'이 작동한다는 것을 알고있다. –

+0

모르겠다. 대답을 게시하고, 병을 뺀다. –

+0

권자, 확인, 병으로 내 대답을 바꾼다. –