我能';在java中使用Keylistener无法移动此形状

我能';在java中使用Keylistener无法移动此形状,java,graphics,Java,Graphics,我是java的初学者,我正在尝试制作一个正方形,它会随着箭头键的移动而移动。我试过很多方法,但都不管用。我的代码/我对代码的理解中可能存在明显的错误,因此如果有人能指出这些错误,那将非常有帮助。 主要类别: 导入java.awt。; 导入javax.swing 图形类: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class graphics2 extends JComponent imple

我是java的初学者,我正在尝试制作一个正方形,它会随着箭头键的移动而移动。我试过很多方法,但都不管用。我的代码/我对代码的理解中可能存在明显的错误,因此如果有人能指出这些错误,那将非常有帮助。 主要类别: 导入java.awt。; 导入javax.swing

图形类:

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

public class graphics2 extends JComponent implements KeyListener{
    public static int x1;
    public static int y1;
    public static int xvelocity = 0;
    public static int yvelocity = 0;


    public void paintComponent(Graphics g){
        graphics2 thing = new graphics2();
        this.addKeyListener(thing);
        System.out.println(x1);
        System.out.println(y1);
        Graphics2D g2 =(Graphics2D)g;
        Rectangle rect = new Rectangle(x1,y1,200,200);
        g2.setColor(Color.red);
        rect.setLocation(x1,y1);
        g2.fill(rect);
        repaint();
        }
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
           x1+=10;
        // TODO Auto-generated method stub
        if(e.getKeyCode()== KeyEvent.VK_LEFT) {
            x1-=10;
        }
   }    
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub      
    }
   @Override
   public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
让我们从

public void paintComponent(Graphics g){
    graphics2 thing = new graphics2();
    this.addKeyListener(thing);
    System.out.println(x1);
    System.out.println(y1);
    Graphics2D g2 =(Graphics2D)g;
    Rectangle rect = new Rectangle(x1,y1,200,200);
    g2.setColor(Color.red);
    rect.setLocation(x1,y1);
    g2.fill(rect);
    repaint();
}
您正在创建
graphics2
的新实例,并向该实例添加
KeyListener
,但由于该实例从未添加到任何可能显示它的内容中,因此它将永远不符合接收键事件的条件

喷漆应在当前状态下进行,并尽快工作。在
paintComponent
中创建短期对象(包括创建
rect
)通常是个坏主意,因为这可能会给系统带来不必要的压力并降低性能

另外,调用
repaint()内部
paintComponent
是一个非常非常糟糕的主意
paintComponent
调用可以出于多种原因调用,这样做将设置一个更新周期,这将消耗CPU并使系统崩溃(是的,我以前做过)

要计划定期更新,更好的选择是使用Swing计时器,请参阅

另一个问题是,您的组件不可聚焦,因此它将永远无法接收键盘焦点,也不会接收按键事件

KeyListener
是一个糟糕的选择,它有很多文档限制(只需搜索“
KeyListener
不起作用”)。相反,您应该使用它来解决
KeyListener

您可能还想看看,让我们从

public void paintComponent(Graphics g){
    graphics2 thing = new graphics2();
    this.addKeyListener(thing);
    System.out.println(x1);
    System.out.println(y1);
    Graphics2D g2 =(Graphics2D)g;
    Rectangle rect = new Rectangle(x1,y1,200,200);
    g2.setColor(Color.red);
    rect.setLocation(x1,y1);
    g2.fill(rect);
    repaint();
}
您正在创建
graphics2
的新实例,并向该实例添加
KeyListener
,但由于该实例从未添加到任何可能显示它的内容中,因此它将永远不符合接收键事件的条件

喷漆应在当前状态下进行,并尽快工作。在
paintComponent
中创建短期对象(包括创建
rect
)通常是个坏主意,因为这可能会给系统带来不必要的压力并降低性能

另外,调用
repaint()内部
paintComponent
是一个非常非常糟糕的主意
paintComponent
调用可以出于多种原因调用,这样做将设置一个更新周期,这将消耗CPU并使系统崩溃(是的,我以前做过)

要计划定期更新,更好的选择是使用Swing计时器,请参阅

另一个问题是,您的组件不可聚焦,因此它将永远无法接收键盘焦点,也不会接收按键事件

KeyListener
是一个糟糕的选择,它有很多文档限制(只需搜索“
KeyListener
不起作用”)。相反,您应该使用它来解决
KeyListener


您可能还希望查看并添加
graphics2
,作为关键侦听器和JFrame组件(我假设您正在使用它):

从上面的
graphics2
中删除这行代码:

this.addKeyListener(this);

graphics2
添加为关键侦听器和JFrame组件(我假设您正在使用该组件):

从上面的
graphics2
中删除这行代码:

this.addKeyListener(this);

你在哪里注册你的
KeyListener
?啊哈,
graphics2 thing=newgraphics2()内部
paintComponent
。。。严重的坏主意<代码>重新绘制()内部
paintComponent
,非常糟糕的想法你在哪里注册你的
KeyListener
?啊哈,
graphics2 thing=newgraphics2()内部
paintComponent
。。。严重的坏主意<代码>重新绘制()内部
油漆组件
,非常糟糕的想法