如何从另一个 class 获取 Keyevent?
How do I get a Keyevent from another class?
所以我得到了 2 个 classes,分别叫做 Viewer 和 PaintWindow。在我的例子中,当我使用我的 PaintWindow class 在 JPanel 上绘制东西时,Viewer class 充当控制器。
现在我正在尝试制作一个小游戏,但我不明白如何实现 KeyListener 才能控制游戏。我想要的是一个监听 keyEvent 发生的监听器,这样我就可以决定会发生什么。这是我的代码的样子:
观看者:
public void run() {
System.out.println("Viewer Run");
cloud1 = new ImageIcon("src/images/cloud.png");
cloud2 = new ImageIcon("src/images/cloud.png");
background1 = new ImageIcon("src/images/background.png");
playerStill = new ImageIcon("src/images/still.png");
playerRight = new ImageIcon("src/images/right.png");
playerLeft = new ImageIcon("src/images/left.png");
paintWindow = new PaintWindow(background1);
paintWindow.showImage(playerStill, 30, 370);
paintWindow.addKeyListener(new KeyTimerListener());
paintWindow.startAlarm();
}
/*
* Lyssnar på vad som händer när man trycker en viss knapp
*/
private class KeyTimerListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32 ){
System.out.print("JUMP");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
}
这是我的 PaintWindow 的一部分 class:
public void addKeyListener(KeyListener listener){
this.listener.add(listener);
}
private class AT extends Thread {
KeyEvent keyevent;
public void run() {
try {
Thread.sleep(1);
}catch(InterruptedException e) {
}
for(KeyListener al : listener) {
al.keyPressed(keyevent);//<-----------------------------
}
thread = null;
}
}
public void startAlarm() {
if(thread==null) {
thread = new AT();
thread.start();
}
}
由于我的 KeyEvent 为空,我得到一个空指针异常。当然,我可以将它定义为一个特定的键,但这对我没有帮助。
我错过了什么?
我认为你的问题是你没有传递任何关键的监听器。尝试实例化您的 KeyTimerListener 并添加它。
public void addKeyListener(new KeyTimerListener ()){
this.listener.add(listener);
忘掉你的 KeyListener
吧,因为 PaintWindow
不会收到任何按键事件,而不是 java.awt.Component 。
相反,将此代码添加到您的 run()
方法中:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(final KeyEvent e) {
// we only want PRESSED events
if(e.getID() == KeyEvent.KEY_PRESSED){
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32 ){
System.out.print("JUMP");
}
}
return false;
}
});
这将监听您应用程序中的所有关键事件。
本主题的更多信息:
How can I listen for key presses (within Java Swing) across all components?
所以我得到了 2 个 classes,分别叫做 Viewer 和 PaintWindow。在我的例子中,当我使用我的 PaintWindow class 在 JPanel 上绘制东西时,Viewer class 充当控制器。
现在我正在尝试制作一个小游戏,但我不明白如何实现 KeyListener 才能控制游戏。我想要的是一个监听 keyEvent 发生的监听器,这样我就可以决定会发生什么。这是我的代码的样子:
观看者:
public void run() {
System.out.println("Viewer Run");
cloud1 = new ImageIcon("src/images/cloud.png");
cloud2 = new ImageIcon("src/images/cloud.png");
background1 = new ImageIcon("src/images/background.png");
playerStill = new ImageIcon("src/images/still.png");
playerRight = new ImageIcon("src/images/right.png");
playerLeft = new ImageIcon("src/images/left.png");
paintWindow = new PaintWindow(background1);
paintWindow.showImage(playerStill, 30, 370);
paintWindow.addKeyListener(new KeyTimerListener());
paintWindow.startAlarm();
}
/*
* Lyssnar på vad som händer när man trycker en viss knapp
*/
private class KeyTimerListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32 ){
System.out.print("JUMP");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
}
这是我的 PaintWindow 的一部分 class:
public void addKeyListener(KeyListener listener){
this.listener.add(listener);
}
private class AT extends Thread {
KeyEvent keyevent;
public void run() {
try {
Thread.sleep(1);
}catch(InterruptedException e) {
}
for(KeyListener al : listener) {
al.keyPressed(keyevent);//<-----------------------------
}
thread = null;
}
}
public void startAlarm() {
if(thread==null) {
thread = new AT();
thread.start();
}
}
由于我的 KeyEvent 为空,我得到一个空指针异常。当然,我可以将它定义为一个特定的键,但这对我没有帮助。
我错过了什么?
我认为你的问题是你没有传递任何关键的监听器。尝试实例化您的 KeyTimerListener 并添加它。
public void addKeyListener(new KeyTimerListener ()){
this.listener.add(listener);
忘掉你的 KeyListener
吧,因为 PaintWindow
不会收到任何按键事件,而不是 java.awt.Component 。
相反,将此代码添加到您的 run()
方法中:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(final KeyEvent e) {
// we only want PRESSED events
if(e.getID() == KeyEvent.KEY_PRESSED){
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32 ){
System.out.print("JUMP");
}
}
return false;
}
});
这将监听您应用程序中的所有关键事件。
本主题的更多信息:
How can I listen for key presses (within Java Swing) across all components?