2013-08-28 24 views
0

我剛寫了一些小代碼試圖讓我的KeyEvent管理器工作。KeyAdapter不起作用

正如你所看到的,我創建了一個JFrame並添加了GameComponent,它是Game類的一個對象。我將JPanel設置爲可聚焦並請求重點。然後一個名爲TAdapter的KeyAdapter被設置爲KeyAdapter。您可以在擴展KeyAdapter和keyPressed()方法的代碼中看到該類。

我告訴程序打印「按下」到我的控制檯時,按下按鍵,但沒有任何反應。

我搞不​​清楚我做錯了什麼,也許有人看到我自己看不到的一些錯誤?

任何幫助表示讚賞提前

感謝

public class Game extends JPanel { 

public static final int WIDTH = 320; 
public static final int HEIGHT = 240; 
public static final int SCALE = 3; 

public Game() { 
    addKeyListener(new TAdapter()); 
    setFocusable(true); 
    requestFocus(); 
} 

public static void main(String[] args) { 
    Game gameComponent = new Game(); 
    Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE); 
    JFrame frame = new JFrame("Invaders"); 

    frame.setVisible(true); 
    frame.setSize(size); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.add(gameComponent); 
} 

public class TAdapter extends KeyAdapter { 

    public void keyPressed(KeyEvent e) { 
     System.out.println("Pressed"); 
    } 
} 
} 
+0

測試了你的代碼,它工作得很好。 –

+0

也許按鈕被某物混淆或窗口不專心? – bcr

+0

也許這可能是我的鍵盤有問題。我在Surface Pro上編寫了代碼,並附上了類型封面,在我的其他電腦上,這些代碼總是像魅力一樣工作。謝謝 – user2410644

回答

4
requestFocus(); 

使用正確的方法是:

requestFocusInWindow(); 

雖然連這種方法不會因爲那些方法的工作只能在可見組件上調用。當你創建組件時,它不可見,所以擺脫那行代碼。

您的代碼的主要問題是您在框架可見後將組件添加到框架。代碼應該是這樣的:

frame.add(gameComponent); 
frame.setSize(size); 
frame.setLocationRelativeTo(null); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setResizable(false); 
frame.setVisible(true); 

setVisible(true)後應所有組件都已經添加到幀你做的最後一件事。

最後你甚至不應該使用KeyListener。 Swing被設計爲與Key Bindings一起使用。正確使用密鑰綁定時,您不會遇到焦點問題。

+0

這只是工作,thnks – user2410644