2013-01-09 70 views
1

當前我正在使用Java編寫一個關卡編輯器。 級別在JPanel中。在這個JPanel裏面,我把遊戲元素(英雄,敵人,樹,牆..)用於每個元素,我使用class.GameElement。JPanel中的JPanel不會監聽KeyListener

public class GameElement extends JPanel 
{ 
protected int posX, posY; 
private Color color; 


public GameElement(int x, int y, Color color) 
{ 
    this.posX = x; 
    this.posY = y; 
    this.color = color; 

} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.setColor(color); 
    g.fillRect(0, 0, 50, 50); 
} 

} 

GameElement類也是一個JPanel。我希望遊戲元素的英雄可以通過使用KeyListener來移動。

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

public class Hero extends Entity implements KeyListener 
{ 
public Hero(int x, int y, Color color) 
{ 
    super(x, y, color); 


    this.setFocusable(true); 
    this.addKeyListener(this); 
} 

public void keyPressed(KeyEvent k) 
{ 
    if(k.getKeyCode() == KeyEvent.VK_UP) 
    { 
     this.move(0, -1); 
    } 
    else if(k.getKeyCode() == KeyEvent.VK_DOWN) 
    { 
     this.move(0, 1); 
    } 
    else if(k.getKeyCode() == KeyEvent.VK_LEFT) 
    { 
     this.move(-1, 0); 
    } 
    else if(k.getKeyCode() == KeyEvent.VK_RIGHT) 
    { 
     this.move(1, 0); 
     System.out.println("test"); 
    } 
} 

public void keyTyped(KeyEvent k) 
{ 

} 

public void keyReleased(KeyEvent k) 
{ 

} 
} 

當我啓動關卡編輯器。英雄顯示在我的屏幕上成功,但當我按下按鍵時它不會移動。是不是因爲我不專注於正確的JPanel?

+2

對於遊戲,您可能需要註冊一個全局密鑰偵聽器,以確保始終獲得關鍵事件。有這樣的幾個問題,例如:http://stackoverflow.com/questions/4780910/jpanel-keylistener – Ash

+1

http://stackoverflow.com/a/10603588/1360074「KeyListener不指定用於偵聽的鍵盤事件的Swing JComponents,使用KeyBindings,而不是「 –

+1

可能重複[類擴展KeyListener不響應按鍵](http://stackoverflow.com/questions/14221458/class-extending-keylistener-not-responding-to-按鍵) –

回答

6

這並不是說你正專注於錯誤的JPanel而是JPanel不可作爲焦點,因此不能與KeyEvents互動。這就是爲什麼在Swing中最好使用Key Bindings,即使組件沒有焦點時,也可以將Action映射到KeyStroke。

example

+0

+1 yup keybindings永遠 –

1

你可以加一個AWTEventListener到默認Toolkit監聽所有關鍵事件,而不是取決於哪個元素具有焦點(只是應用程序必須具有焦點):

AWTEventListener theListener = new AWTEventListener() { 
     @Override 
     public void eventDispatched(AWTEvent event) { 
      System.out.println(event); 
     } 
    }; 
    Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    toolkit.addAWTEventListener(theListener, AWTEvent.KEY_EVENT_MASK); 

編輯
AWTEvents是一種低層次的事件,更喜歡使用ActionMap/InputMap(或只是registerKeyboardAction