【问题标题】:Applet - KeyListener not working小程序 - KeyListener 不工作
【发布时间】:2012-11-15 17:19:29
【问题描述】:

当我启动我的小程序时,我没有收到来自关键监听器的响应。我该如何解决?下面是代码。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;

public class Main extends Applet {
private static final long serialVersionUID = 1L;
public String mode = "";
public Graphic gr;

public void init() {
    this.setSize(400, 400);
    gr = new Graphic();
    this.add(gr);
    gr.addKeyListener(new MyKeyListener());
    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
                    gr.requestFocus();
            gr.repaint();
        }

    };
    new Timer().scheduleAtFixedRate(timerTask, 0, 1000 / 5);

}

public void paint(Graphics g) {

}

private class MyKeyListener extends KeyAdapter {
    public MyKeyListener(){
        System.out.println("HELLO");
    }
    public void keyPressed(KeyEvent e) {

        switch (e.getKeyCode()) {
        case KeyEvent.VK_UP:
            gr.direction = Graphic.Direction.up;
            gr.move();

            break;
        case KeyEvent.VK_DOWN:
            gr.direction = Graphic.Direction.down;
            gr.move();
            break;
        case KeyEvent.VK_LEFT:
            gr.direction = Graphic.Direction.left;
            gr.move();
            break;
        case KeyEvent.VK_RIGHT:
            gr.direction = Graphic.Direction.right;
            gr.move();
            break;
        }
    }

    public void keyReleased(KeyEvent e) {

    }
}
}

【问题讨论】:

  • “我没有得到关键听众的回应。” 给定像public void paint(Graphics g) { } 这样的代码,我很惊讶你什么都得到了。 1) 为什么要在第三个千年使用 AWT? 2)为什么是小程序而不是框架? 3)为什么KeyListener而不是键绑定? 4) 为什么不调用任何提到“焦点”的方法?有关详细信息,请参阅focus 教程。 -- 看起来你正在尝试“魔法编码”,而这通常不起作用。
  • this.setSize(400, 400); 不要那样做。小程序的大小由 HTML 中的属性设置。
  • 尝试使用像这样的计时器来获取焦点在任何时候都是一个可怕的想法,永远不要这样做(我知道“只是一个测试” - 但声明成立)。避开关键听众并支持key bindings,他们不会像KeyListeners 那样遭受同样的焦点问题
  • 我认为 setSize 在本地机器上测试仍然很方便

标签: java applet awt keylistener


【解决方案1】:
    import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Shape;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TTest extends Applet{
    @Override
    public void init() {
        // TODO Auto-generated method stub
        super.init();
        this.setSize(400, 400);
        addKeyListener(new KeyListener());

    }
    class KeyListener extends KeyAdapter{
        public KeyListener(){

        }

        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            super.keyPressed(e);
            switch(e.getKeyCode()){
            case KeyEvent.VK_UP:
                System.out.println("Pressed up arrow!");
                break;
            case KeyEvent.VK_DOWN:
                System.out.println("Pressed down arrow!");
                break;
            default:
                System.out.println("You pressed: " + e.getKeyCode());
            }
        }

    }
}

您必须将键事件侦听器添加到小程序本身而不是图形对象。但是,我认为可以将鼠标事件侦听器添加到小程序之外的对象

【讨论】:

  • 1- 我认为Graphic 有自己的课程。 2-关于完全缺乏上下文,我会避免建议使用KeyListener,这种事情有更好的API - 恕我直言
  • 我认为问题是在上面的代码中引起的,因为当你部署你的程序时,程序关注的是小程序对象而不是图形对象。因此键盘侦听器无法识别输入。
猜你喜欢
  • 2016-05-25
  • 2012-11-01
  • 1970-01-01
  • 2011-11-27
  • 2013-06-08
相关资源
最近更新 更多