Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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_Applet_Keylistener - Fatal编程技术网

为什么我的Java程序不使用KeyListener确认任何按键?

为什么我的Java程序不使用KeyListener确认任何按键?,java,applet,keylistener,Java,Applet,Keylistener,我真的不知道为什么我的程序不能识别键盘输入。我在整个程序中放置了print语句来确定问题,并且我确定keyPressed方法永远不会激活。这是一个游戏,我正在为一个类项目制作,是的,我是一个相对初学者程序员。提前谢谢!(代码如下) 我不确定它是否适用于小程序,但您的线程可能不允许事件分派发生 尝试使用运行您的“工作”。首先,您可能希望将您的类与您的KeyListener分开,因为这样会使其更难阅读 下一步,您希望去掉裸线程,并将其包装在计时器中 import javax.swing.Timer;

我真的不知道为什么我的程序不能识别键盘输入。我在整个程序中放置了print语句来确定问题,并且我确定keyPressed方法永远不会激活。这是一个游戏,我正在为一个类项目制作,是的,我是一个相对初学者程序员。提前谢谢!(代码如下)


我不确定它是否适用于小程序,但您的
线程可能不允许事件分派发生


尝试使用运行您的“工作”。

首先,您可能希望将您的类与您的KeyListener分开,因为这样会使其更难阅读

下一步,您希望去掉裸
线程
,并将其包装在计时器中

import javax.swing.Timer;

class Dodger extends JApplet {

    Timer imageUpdater; //replaces Thread

    /*...*/
    public void init() {
        /*etc*/
        loadpic();
        int repaintInterval = 100;
        imageUpdater = new Timer(repaintInterval,
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    repaint();
                }
            }
        );
        imageUpdater.start();
        addKeyListener(new KeyHandler());
        setFocusable(true);
     }

    /*...*/
    private class KeyHandler extends KeyAdapter {
        /* Note that with this implementation, you do not have to override
         * unnecessary methods, as KeyAdapter is an abstract class that
         * implements all of the methods of KeyListener.
         */
        @Override
        public void keyPressed(KeyEvent e) {
        /*...*/
        }
    }
    /*...*/
}

这大部分只是代码清理-实际问题可能会通过
setFocusable(true)
解决(根据Tom的说法,请参阅注释)。当小程序可聚焦并具有焦点时,可以很好地检测到关键事件。管理焦点一直是小程序的一个问题。问题主要在于Sun从未费心指定焦点行为,理想情况下,该行为应适用于可聚焦HTML元素和小程序的混合页面

根据Tom的建议,在
init()的末尾添加

为安全起见,还应覆盖:

public void start() {
    this.requestFocusInWindow();
}
顺便说一句,一般来说最好在秋千上使用。它们还要求小程序具有输入焦点



您是否确保小程序具有焦点?如果小程序没有焦点,按键将不会被捕获。要更快获得更好的帮助,请发布一个。请注意,在我看到小程序和测试理论之前,我不得不花一些时间来解决缺少图像的问题。当涉及到问题本身时,init()中的setFocusable(true)应该可以做到这一点。@Tom(对我来说)奇怪的是,小程序在使用Eclipse启动时已经可以聚焦了。@AndrewThompson对我来说,它不可聚焦。使用Netbeans 7.1.1和Oracle JDK 1.7启动。老实说,我总是觉得聚焦小程序有点混乱。额外调用setFocusable不会有任何伤害。@Tom“额外调用setFocusable不会有任何伤害。”你说得对。我只是尝试了一下,这就解决了从Eclipse运行时的“无即时焦点”问题。“我总是觉得聚焦小程序有点让人困惑。”告诉我吧。请参阅我(经过大量编辑)答案的开头。@mKorbel每次我一起看到Swing&
KeyListener
时,我都会想到SwingWorkker的键绑定..+1,但可能不是,线程被包装成Runnable,问题可能是18岁时的有趣睡眠miliseconds@mKorbel我不认为SwingWorker在这里有用。这不是一个“长时间运行的任务”(在800x800查看区域绘制2个图像),它只是一个“重复任务”-只需要一个
计时器
。无论如何,我认为任何修改GUI的线程都必须在Swing的事件调度线程上运行,如SwingWorkers文档中所述。这不会造成任何伤害…@petermm在所有讨论之后(与安德鲁·汤普森)
setFocusable(true);
public void start() {
    this.requestFocusInWindow();
}