我的问题是,如果我使用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");
}
}
提前感谢您的帮助。另外,如果我在这方面做错了什么,请随时告诉我。
答案 0 :(得分:0)
添加新组件时,包含侦听器的组件将失去焦点。要使侦听器工作,具有侦听器的组件必须是焦点所有者。
如果您需要某个组件成为焦点所有者,则可以使用component.requestFocus();
来关注组件请求。
在您的问题中,您拥有applet的监听器,但在添加drawArea
组件后,您的drawArea
画布获得了关注。由于您的drawArea
没有监听器,并且它是焦点所有者,因此没有触发任何关键事件。将keylistener添加到drawArea
,或者让您的applet requestFocus()
(尽管每次点击drawArea
时,它都会再次成为焦点所有者。我强烈建议添加lodtener因为这个(或使用键绑定)<{1}}