Java中JFrame的更新。复制的对象

Java中JFrame的更新。复制的对象,java,swing,jframe,repaint,Java,Swing,Jframe,Repaint,我正在BlueJ中开发一个简单的游戏,它就像一个“太空入侵者”。我的问题是,当我移动一个物体时,比如带有键侦听器的不明飞行物,旧的不明飞行物不会消失 要更新框架,请执行以下操作: public static void updateJframe() { SwingUtilities.updateComponentTreeUI(canvas); } canvas是我的类canvas中的变量,它扩展了JFrame 如果需要更多的代码,我没有问题发布它 好的,很抱歉在评论中发布代码,我也是这里的n

我正在BlueJ中开发一个简单的游戏,它就像一个“太空入侵者”。我的问题是,当我移动一个物体时,比如带有
键侦听器的不明飞行物,旧的不明飞行物不会消失

要更新框架,请执行以下操作:

public static void updateJframe()
{
  SwingUtilities.updateComponentTreeUI(canvas);
}
canvas
是我的类
canvas
中的变量,它扩展了
JFrame

如果需要更多的代码,我没有问题发布它

好的,很抱歉在评论中发布代码,我也是这里的noob:$

public class Inout 
{

    private static Canvas canvas;
    private Motor motor;

    public Inout()
    {
        motor = new Motor(); //in class "Motor" is the logic of the game
       canvas = new Canvas();
    }

    public static void actualizar() //this is the method where i'm trying to update the                     frame
    {
        canvas.removeAll();
        SwingUtilities.updateComponentTreeUI(canvas);
    }

    public class Canvas extends JFrame implements KeyListener 
    {


        public Canvas ()
        {
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
            setTitle("Space Invaders");
            setSize(1200,600);
            setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }

        public void paint(Graphics g)
        {
            int i = 0;
            int j = 0;
            for (i = 0; i < 30 ; i++)
            {
                for (j = 0; j < 50; j++)
                {
                    if (Motor.cuadricula[i][j].esUfo())    
                    {
                        g.setColor (Color.blue);
                        g.fillRect(i*40,j*20,20,15);   
                    }
                    else if (Motor.cuadricula[i][j].esDef())    
                    {
                        g.setColor (Color.red);
                        g.fillRect(i*40,j*20,20,15);}
                    }
                }
            }
        }   
        public void keyPressed(KeyEvent e)
        {}

        public void keyReleased(KeyEvent e)
        {
            int keyCode = e.getKeyCode();
            if(keyCode == KeyEvent.VK_P){
                Motor.moverDef(1);//mover una casilla a la derecha

            }
            else if(keyCode == KeyEvent.VK_O){
                Motor.moverDef(0);//mover una casilla a la izquierda
                Inout.actualizar();
            } 
        }

        public void keyTyped (KeyEvent e){}
    }
}
公共类Inout
{
私有静态画布;
私家车;
公共Inout()
{
motor=new motor();//类中的“motor”是游戏的逻辑
画布=新画布();
}
public static void actualizar()//这是我试图更新帧的方法
{
canvas.removeAll();
SwingUtilities.updateComponentTreeUI(画布);
}
公共类Canvas扩展JFrame实现KeyListener
{
公共画布()
{
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);
SETTILE(“太空入侵者”);
设置大小(1200600);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
公共空间涂料(图g)
{
int i=0;
int j=0;
对于(i=0;i<30;i++)
{
对于(j=0;j<50;j++)
{
if(Motor.cuadricula[i][j].esUfo())
{
g、 setColor(Color.blue);
g、 fillRect(i*40,j*20,20,15);
}
else if(Motor.cuadricula[i][j].esDef())
{
g、 setColor(Color.red);
g、 fillRect(i*40,j*20,20,15);}
}
}
}
}   
按下公共无效键(按键事件e)
{}
公共无效密钥已释放(密钥事件e)
{
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_P){
Motor.moverDef(1);//mover una casilla a la derecha
}
else if(keyCode==KeyEvent.VK_O){
Motor.moverDef(0);//mover una casilla la izquierda
Inout.realizar();
} 
}
public void keyTyped(KeyEvent e){}
}
}
我无法理解的主题是:如果我使用其他任何方法中的“actualizar”;“方法,它工作得很好,但是如果从KeyListener中执行,则会出现错误


非常感谢你的帮助

好方法:使用paintComponent方法而不是paint,在重新绘制时旧对象不会消失


糟糕的方法:每次调用paint时(在方法开始时)填充背景-它将覆盖您以前绘制的所有内容。

1)要更快获得更好的帮助,请发布一个。2) 在
JPanel
中重写
paintComponent()
,并将其添加到框架中。3) 调用
super.paintComponent(图形)在绘画之前,删除早期的绘画。不太可能有人想涉过这么大的例子。一行通常少于一百行。您当前的代码不恰当地使用了
updateComponentTreeUI()
“打包我的代码让您阅读”。如果您想让我阅读,请制作一个SSCCE并将其编辑到问题中。请注意,很少有人会关注链接或查看比SO上发布的长度更长的代码。另请参见
KeyListener
上的此内容和此动画。@user1376672:请不要在注释部分发布代码(代码会丢失格式且无法阅读,如您所见),而是删除上面的注释,编辑您的原始帖子,然后在原始帖子中发布代码。然后发表评论,通知我们您的编辑。