添加组件是否会影响applet中的KeyListeners?

时间:2014-05-04 00:37:32

标签: java image applet awt keylistener

我的问题是,如果我使用add()方法添加Canvas(如果有其他的话,那么Component java.awt.Container.add一个),它是否会影响正在运行的任何其他内容,即我的KeyListener?我一直试图弄清楚为什么我的所有按键都没有注册,并且如果我不添加一个画布实例就发现它们有效,但是当我添加它时它们不起作用。

不幸的是,我没有任何方法可以不添加它并仍然有游戏,因为这是我显示图形的唯一方法。我认为这是其他人可能遇到的问题,特别是如果他们刚刚开始使用applet,因为它是创建游戏循环的一个简单部分,但我无法找到关于此问题的任何其他文章。如果我在添加KeyListener时没有影响任何内容,那么应该运行addKeyListener方法呢?

这是我正在尝试运行的代码:

import java.applet.Applet;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

public class Welcome extends Applet implements Runnable, KeyListener {
private static final long serialVersionUID=1L;

private BufferStrategy bufferStrategy;
private Canvas drawArea;/*Drawing Canvas*/

private final int WIDTH=300;
private final int HEIGHT=WIDTH*9/16;
private final int SCALE=2;

private BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
int[] pixels=((DataBufferInt)image.getRaster().getDataBuffer()).getData();

public void init() {
    Thread t=new Thread(this);
    drawArea=new Canvas();
    setIgnoreRepaint(true);
    t.start();
    this.setSize(WIDTH*SCALE, HEIGHT*SCALE);
}

public void render() {
    for (int i=0; i<pixels.length; i++) {
        pixels[i]=i;
    }

    Graphics g=bufferStrategy.getDrawGraphics();
    g.drawImage(image, 0, 0, WIDTH*SCALE, HEIGHT*SCALE, this);
    g.dispose();
    if (!bufferStrategy.contentsLost()) {
        bufferStrategy.show();
    }
}

public void update() {

}

public void run() {

    //drawArea.setSize(new Dimension(getWidth(), getHeight()));
    add(drawArea);//WORKS WITHOUT THIS LINE OF CODE, BUT NOT WITH IT
    addKeyListener(this);
}

public void keyPressed(KeyEvent e) {
    System.out.println("Here");
}

public void keyReleased(KeyEvent e) {
    System.out.println("Here");

}

public void keyTyped(KeyEvent e) {
    System.out.println("Here");

}

}

提前感谢您的帮助。另外,如果我在这方面做错了什么,请随时告诉我。

1 个答案:

答案 0 :(得分:0)

添加新组件时,包含侦听器的组件将失去焦点。要使侦听器工作,具有侦听器的组件必须是焦点所有者。

如果您需要某个组件成为焦点所有者,则可以使用component.requestFocus();来关注组件请求。

在您的问题中,您拥有applet的监听器,但在添加drawArea组件后,您的drawArea画布获得了关注。由于您的drawArea没有监听器,并且它是焦点所有者,因此没有触发任何关键事件。将keylistener添加到drawArea,或者让您的applet requestFocus()(尽管每次点击drawArea时,它都会再次成为焦点所有者。我强烈建议添加lodtener因为这个(或使用键绑定)<{1}}