【问题标题】:KeyListener won't work [closed]KeyListener 不起作用[关闭]
【发布时间】:2012-01-28 15:35:19
【问题描述】:

我尝试通过创建一个圆圈来测试我的图形程序,然后在它们上添加关键侦听器并使其工作。

但我看到它不起作用!但是图形效果很好!

那么,你能帮我更正一下代码吗?

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

import javax.swing.*; //AWT extends

public class dotMoveByArrow extends JPanel implements ActionListener, KeyListener {

    Timer t = new Timer(5, (ActionListener) this);
    double x = 0, y = 0, velX = 2, velY= 2;

    public void dotMoveByArrow() {

        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        setVisible(true);
    }

    public void paintComponent(Graphics g) {

        super.paintComponents(g);
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D circle = new Ellipse2D.Double(x, y, 40, 40);
        g2.fill(circle);
    }

    public void actionPerformed(ActionEvent event) {

        repaint();
        x += velX;
        y += velY;
    }

    public void up() {

        velY = -1.5;
        velX = 0;
    }

    public void down() {

        velY = 1.5;
        velX = 0;
    }

    public void left() {

        velX = -1.5;
        velY = 0;
    }

    public void right() {

        velX = 1.5;
        velY = 0;
    }

    public void keyPressed(KeyEvent event) {

        int key = event.getKeyCode();
        if (key == KeyEvent.VK_UP) {

            up();
            System.out.println("up");
        }

        if (key == KeyEvent.VK_DOWN) {

            down();
            System.out.println("down");
        }

        if (key == KeyEvent.VK_LEFT) {

            left();
            System.out.println("left");
        }

        if (key == KeyEvent.VK_RIGHT) {

            right();
            System.out.println("right");
        }
    }

    public void keyReleased(KeyEvent arg0) {}

    public void keyTyped(KeyEvent arg0) {}

    public static void main(String[] args) {

        dotMoveByArrow d = new dotMoveByArrow();
        JFrame f = new JFrame();

        f.getContentPane().add(d);
        f.setBackground(new Color(255, 255, 255));
        f.setUndecorated(true);
        f.setVisible(true);
        f.setSize(640, 480);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("Dot Move by Arrow");
    }
}

【问题讨论】:

  • 关于:“那么,你能帮我更正一下代码吗?” -- 如果您遵循我们的建议并自己更正您的代码,对您来说会更好。我建议你谷歌并使用键绑定,而不是 KeyListener。有一个不错的教程,你可以很容易地找到这个,还有很多很多的例子可以在论坛中找到,比如这个(我写的几个)。运气。 编辑:这是教程链接:How to Use Key Bindings

标签: java swing keylistener


【解决方案1】:

你的代码的一个问题是你定义了一个方法

public void dotMoveByArrow() { ... }

可能被认为是构造函数

public dotMoveByArrow() { ... }

(注意声明中没有void)。

该方法永远不会在您的代码中调用,因此侦听器根本没有注册。

【讨论】:

  • @GrimReaper 欢迎来到 StackOverflow!请单击您认为最能回答问题的答案旁边的复选标记。这归功于提供正确答案的人,并告诉其他用户该问题有一个有效的解决方案。谢谢! :)
【解决方案2】:

永远不会调用dotMoveByArrow 方法,因此永远不会添加您的侦听器。如果dotMoveByArraow 应该是一个构造函数,那么它应该被声明为

public dotMoveByArrow()

没有void 返回类型。按照惯例,Java 类总是以大写字母开头。因此,构造函数也以大写字母开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多