2011-06-18 145 views
0

我希望能够注册触发布尔变量的按键事件。我已经在我的主类中完成了,但是现在我正试图将它放到类中,而且它似乎并没有工作。键监听器事件没有触发?

这里是英雄职业:

public class Hero extends Main { 
private boolean downPressed; 
private boolean leftPressed; 
private boolean rightPressed; 

public void init() { 
} 

public void paint(Graphics g, int x_pos, int y_pos) { 

    if (isDownPressed() && isLeftPressed()) { 
     this.sprite = hero225; 
    } else if (isDownPressed() && isRightPressed()) { 
     this.sprite = hero135; 
    } else if (isUpPressed() && isRightPressed()) { 
     this.sprite = hero45; 
    } else if (isUpPressed() && isLeftPressed()) { 
     this.sprite = hero315; 
    } else if (isLeftPressed() == true) { 
     this.sprite = hero270; 
    } else if (isRightPressed() == true) { 
     this.sprite = hero90; 
    } else if (isUpPressed() == true) { 
     this.sprite = hero; 
     System.out.println("Succsess"); 
    } else if (isDownPressed() == true) { 
     this.sprite = hero180; 
    } 

    // this.sprite will contain value set on last "movement" 
    g.drawImage(this.sprite, x_pos, y_pos, this); 
} 

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     setLeftPressed(true); 
     System.out.println("keyPressed"); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     setRightPressed(true); 

    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     setUpPressed(true); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     setDownPressed(true); 
    } 

} 

public void keyReleased(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     setLeftPressed(false); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

     setRightPressed(false); 
    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     setUpPressed(false); 

    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     setDownPressed(false); 
    } 
} 

public void keyTyped(KeyEvent e) { 

} 

public void mouseClicked(MouseEvent e) { 
    System.out.println("HIT!"); 

} 

public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

public void mousePressed(MouseEvent e) { 
    boolean isButtonPressed = true; 

} 

public void mouseReleased(MouseEvent e) { 
    boolean isButtonPressed = false; 

} 


public void setDownPressed(boolean downPressed) { 
    this.downPressed = downPressed; 
} 

public boolean isDownPressed() { 
    return downPressed; 
} 

public void setLeftPressed(boolean leftPressed) { 
    this.leftPressed = leftPressed; 
} 

public boolean isLeftPressed() { 
    return leftPressed; 
} 

public void setRightPressed(boolean rightPressed) { 
    this.rightPressed = rightPressed; 
} 

public boolean isRightPressed() { 
    return rightPressed; 
} 

public void setUpPressed(boolean upPressed) { 
    this.upPressed = upPressed; 
} 

public boolean isUpPressed() { 
    return upPressed; 
} 

在此可以调用它的级别类:

public class Level extends Main { 
Hero hero = new Hero(); 

public void paint(KeyEvent e, Graphics g, double x_pos, double x_pos2) { 
    repaint(); 
} 

,这里是在调用主类的涂料功能:

public void paint(Graphics g) { 
    Level level = new Level(); 
    level.paint(e, g, x_pos, y_pos); 

造成这种情况的问题似乎并不明显。

回答

2

你应该实现java.awt.event.KeyListener接口要监听事件类(ES),在这种情况下英雄,所以:

public class Hero extends Main implements java.awt.event.KeyListener 

,然后注册在某些方法的事件,也许init或别的地方使用:

addKeyListener(this); 
//rest of your code 

或者,如果你要听的只是一些事件,你可以而不是实现接口KeyListener的,注册一个适配器:

addKeyListener(new java.awt.KeyAdapter() 
{ 
    public void keyPressed(java.awt.KeyEvent e) 
    { 
     //handle just this event 
    } 
} 
); 
//rest of of your code 
+0

我得到这个错误,当我按照第二步:方法addEventListener(英雄)是未定义的类型英雄 – Derek

+0

我编辑了我的答案,所以你可以测试它 –

+0

我设法让它在英雄类工作(Woop!)但它在Level类中不起作用。我所做的是把一个System.out.println(“keyPressed”);在if(isDownPressed()&& isLeftPressed()){。但是当我加载了Level并按下左键时:控制台中没有任何事情发生: – Derek

1

听起来像焦点问题:只有活动组件才会获得KeyEvents。

有几种方法可以解决这个问题,但我发现this教程涵盖了很好的想法。但是,如果你想要一个快速和肮脏的(肮脏的?不知道,简单和简单不坏,我会想;只是有点臃肿的大型项目)解决方案,你可以实现一个监听器为每个组件,并转发事件一些处理它的普通类。

+0

+1“为了触发键盘事件,一个组件必须具有键盘焦点。“ - [如何编写关键侦听器](http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html) – trashgod