2015-09-26 31 views
-1

我有一個JFrame,它在運行時添加了一個keyListener,但是當Frame加載時,會有一個短暫的時間來接收輸入,然後它只停止接收輸入,這裏是Keyboard.java代碼:Java JFrame沒有收到輸入

package uk.connorwright.rain.input; 

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

public class Keyboard implements KeyListener { 

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

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]; 

} 

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

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

public void keyTyped(KeyEvent e) { 

    } 

} 

這是Game.java其中涉及鍵盤輸入代碼:

private Keyboard key; 

...

key = new Keyboard(); 

    frame.addKeyListener(key); 

....

公共無效更新(){
key.update();

if (key.up) { 
     y--; 
    } 

    if (key.down) { 
     y++; 
    } 

    if (key.left) { 
     x--; 
    } 

    if (key.right) { 
     x++; 
    } 
} 

...

public static void main(String[] args) { 
     Game game = new Game(); 

回答

2

KeyListener是一個糟糕的選擇,它負責生成事件的組件時,它是可聚焦的,它具有焦點。

相反,你應該考慮使用的鍵綁定API,它爲您提供的手段在什麼關注程度應該生成密鑰事件

詳情請參閱How to Use Key Bindings來決定。

+0

我寧願讓我的代碼工作,然後進行轉換,但在我啓動它的時候,它得到輸入,直到我點擊,然後它停止接收輸入 –

+1

@BasicsCoding如果你想獲得你的代碼工作,然後使用Key Bindings API。正如我所說,如果聽衆註冊的組件是可以聚焦和有焦點的,組件只會引發關鍵的棋盤事件。 – MadProgrammer

1

我還沒有測試過這個,但我認爲你的KeyListener可能需要一個鍵盤焦點的組件,而JFrame永遠不會有這個。只有框架的子組件纔會有重點。

從教程: https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

具體而言,關鍵事件是由組分與鍵盤 焦點燒製當用戶按下或釋放鍵盤按鍵。有關焦點的詳細信息,請參閱如何使用焦點子系統 。

所以沒有關鍵事件,如果你沒有焦點。

+0

在我的主要方法中,我有'game.frame.requestFocus();'使它可見之後,並且那麼下一行代碼就是'game.start();' –

+0

並且在你調用requestFocus()之後,系統會把焦點發送給其他實際需要焦點的組件。 「請求」就是這個意思,它可能不起作用。 – markspace

+0

我已添加'框架。我的'public void update()'方法使用了'requestFocus()'方法,這已經起作用了 –