java - 使用 KeyListener 使用箭头键在 JPanel 中移动矩形

标签 java swing jpanel awt keylistener

我一直在尝试使用箭头键移动JPanel。它没有发挥作用。我相信我的内部类扩展了KeyAdapter。我也不确定 ActionListener 是否已实现。我制作的其他类(class)并不重要,因为它只是框架。

package jerryWorlds;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Jerry extends JPanel implements ActionListener{

int SizeX, SizeY, PosX, PosY, VelX, VelY;
Image img;
Timer time = new Timer(1, this);

public Jerry(){
    ImageIcon i = new ImageIcon();
    addKeyListener(new AL());
    time.start();
    img = i.getImage();
    PosX = 375;
    PosY = 250;
}

public void paint(Graphics g){
    Graphics2D g2d = (Graphics2D)g;
    g2d.fillRect(PosX, PosY, 50, 100);
}
public void actionPerformed(ActionEvent e) {
    PosX = PosX + VelX;
    repaint();
}

private class AL extends KeyAdapter{
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        System.out.println("YAY!");
        if(key == KeyEvent.VK_LEFT)
            VelX = -1;
        else if(key == KeyEvent.VK_RIGHT)
            VelX = 1;
    }

    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_LEFT)
            VelX = 0;
        else if(key == KeyEvent.VK_RIGHT)
            VelX = 0;
    }
}

}

最佳答案

  • 您需要在此网站上搜索类似问题,因为这些问题通常有相同的问题和相同的答案。
  • 他们会告诉您焦点是一个问题,因为组件的 KeyListener 在没有焦点的情况下无法工作。
  • 他们会告诉您,无论如何,您根本不应该使用 KeyListener,而应该使用 Key Bindings。
  • 他们会告诉您不要重写paint(...),而是重写paintComponent(...),除非您确定要重写某个对象的绘制组件的边框和子组件(您不需要)。
  • 他们会告诉您一定要调用 paintComponent(...) 内部的 super 方法。

另外请看看这个animation and key bindings example .

关于java - 使用 KeyListener 使用箭头键在 JPanel 中移动矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246443/

相关文章:

java - 为什么私有(private)方法也不能是最终的?

java - 如何在Websphere中设置log4j.properties文件的相对路径

java - 有 2 个按钮影响同一个标签

java - 简单的 Java 程序越来越消耗内存

java - 我的 JTable 列的名称未显示

java - 我已经创建了一个基本的 GUI,但按钮不会与文本字段交互

Java JTable 列标题未显示 - JScrollPane?

java - 证明旧的 Date Java API 不是线程安全的

java - 在单个 JFrame 中使用多个 JPanel

java - 代码有什么问题吗? Horstmann 书中的第一个代码示例