Java中JFrame的更新。复制的对象
我正在BlueJ中开发一个简单的游戏,它就像一个“太空入侵者”。我的问题是,当我移动一个物体时,比如带有Java中JFrame的更新。复制的对象,java,swing,jframe,repaint,Java,Swing,Jframe,Repaint,我正在BlueJ中开发一个简单的游戏,它就像一个“太空入侵者”。我的问题是,当我移动一个物体时,比如带有键侦听器的不明飞行物,旧的不明飞行物不会消失 要更新框架,请执行以下操作: public static void updateJframe() { SwingUtilities.updateComponentTreeUI(canvas); } canvas是我的类canvas中的变量,它扩展了JFrame 如果需要更多的代码,我没有问题发布它 好的,很抱歉在评论中发布代码,我也是这里的n
键侦听器的不明飞行物,旧的不明飞行物不会消失
要更新框架,请执行以下操作:
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:请不要在注释部分发布代码(代码会丢失格式且无法阅读,如您所见),而是删除上面的注释,编辑您的原始帖子,然后在原始帖子中发布代码。然后发表评论,通知我们您的编辑。