Java 添加组件是否会影响小程序中的KeyListener?
我的问题是,如果我使用add()方法添加画布(组件java.awt.Container.addone,如果还有其他方法),它会影响正在运行的任何其他东西,即我的KeyListener吗?我一直在试图弄清楚为什么我所有的按键都没有注册,并且发现如果我不添加画布的一个实例,它们就可以工作,但是当我添加画布时,它们就不工作了 不幸的是,我真的没有办法不添加它而仍然拥有一个游戏,因为这是我显示图形的唯一方法。我认为其他人可能会遇到这种情况,特别是当他们刚刚开始使用applet时,因为这是创建游戏循环的一个简单部分,但我找不到关于这个问题的任何其他文章。如果在添加KeyListener时它不影响任何内容,那么应该运行addKeyListener方法吗 以下是我正在尝试运行的代码:Java 添加组件是否会影响小程序中的KeyListener?,java,image,applet,awt,keylistener,Java,Image,Applet,Awt,Keylistener,我的问题是,如果我使用add()方法添加画布(组件java.awt.Container.addone,如果还有其他方法),它会影响正在运行的任何其他东西,即我的KeyListener吗?我一直在试图弄清楚为什么我所有的按键都没有注册,并且发现如果我不添加画布的一个实例,它们就可以工作,但是当我添加画布时,它们就不工作了 不幸的是,我真的没有办法不添加它而仍然拥有一个游戏,因为这是我显示图形的唯一方法。我认为其他人可能会遇到这种情况,特别是当他们刚刚开始使用applet时,因为这是创建游戏循环的一
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");
}
}
import java.applet.applet;
导入java.awt.Canvas;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.image.BufferStrategy;
导入java.awt.image.buffereImage;
导入java.awt.image.DataBufferInt;
公共类Welcome extends小程序实现可运行的KeyListener{
私有静态最终长serialVersionUID=1L;
私有缓冲策略;
专用画布绘图区域;/*绘图画布*/
私有最终整数宽度=300;
专用最终内部高度=宽度*9/16;
私人最终智力量表=2;
私有BuffereImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
int[]像素=((DataBufferInt)image.getRaster().getDataBuffer()).getData();
公共void init(){
螺纹t=新螺纹(此);
drawArea=新画布();
setIgnoreRepaint(真);
t、 start();
设置大小(宽度*刻度,高度*刻度);
}
公共无效呈现(){
对于(int i=0;i添加新组件时,包含侦听器的组件正在失去焦点。要使侦听器正常工作,具有侦听器的组件必须是焦点所有者
如果您需要某个组件作为焦点所有者,则可以使用component.requestFocus();
使该组件请求焦点
在您的问题中,您将侦听器添加到小程序中,但在添加drawArea
组件后,drawArea
画布获得了焦点。由于您的drawArea
没有侦听器,并且它是焦点所有者,因此未触发任何关键事件。请将keylistener添加到drawArea
,或者让您的小程序requestFocus()
(尽管每次单击drawArea
,它都会再次成为焦点所有者。因此,我强烈建议将lodtener添加到drawArea
(或使用键绑定)添加新面板时,焦点可能会转到该面板。添加侦听器的组件必须处于焦点位置。添加面板后,请尝试调用component.requestFocus()
关于包含Listener的组件非常感谢。这完全解决了问题。对于其他有相同问题的人,您必须先执行drawArea.addKeyListener(此),然后执行drawArea.requestFocus()。再次感谢!@VinceEmigh或WiErD0将其作为答案发布,因为许多浏览此网站的人将无法查看评论:)