Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加组件是否会影响小程序中的KeyListener?_Java_Image_Applet_Awt_Keylistener - Fatal编程技术网

Java 添加组件是否会影响小程序中的KeyListener?

Java 添加组件是否会影响小程序中的KeyListener?,java,image,applet,awt,keylistener,Java,Image,Applet,Awt,Keylistener,我的问题是,如果我使用add()方法添加画布(组件java.awt.Container.addone,如果还有其他方法),它会影响正在运行的任何其他东西,即我的KeyListener吗?我一直在试图弄清楚为什么我所有的按键都没有注册,并且发现如果我不添加画布的一个实例,它们就可以工作,但是当我添加画布时,它们就不工作了 不幸的是,我真的没有办法不添加它而仍然拥有一个游戏,因为这是我显示图形的唯一方法。我认为其他人可能会遇到这种情况,特别是当他们刚刚开始使用applet时,因为这是创建游戏循环的一

我的问题是,如果我使用add()方法添加画布(组件java.awt.Container.addone,如果还有其他方法),它会影响正在运行的任何其他东西,即我的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");

}

}
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将其作为答案发布,因为许多浏览此网站的人将无法查看评论:)