在JPanel中更新矩形或任何其他图像的位置而不重叠

时间:2017-08-12 18:40:17

标签: java swing

我的方法是在循环中使用'reprint()'成功移动图像,这意味着更新其位置而不重叠但现在我想看到图像移动,我使用'thread.sleep()'来给出repaint()之间的时间差距,但它似乎无法正常工作

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

public class jp extends JPanel implements ActionListener{
Timer t;
JPanel jl=new JPanel();
int x,y;
jp(){
    x=10;
    //y=10;
    t=new Timer(5,this);
    t.start();
}
public void actionPerformed(ActionEvent e){
    x++;
    y++;
    if(x>500){
        x=0;
        y=0;
    }
    repaint();
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    this.setBackground(Color.black);
    g.setColor(Color.blue);
    g.fillRect(x,20,50,50);
}

}

public class Jpanel  extends JFrame{


public static void main(String[] args) {
    jp p=new jp();

    JFrame j=new JFrame("TEST_CASE-1");
    j.add(p);
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    j.setSize(700,500);
    j.setVisible(true);
  }

}

1 个答案:

答案 0 :(得分:0)

如果您希望通过paintComponent()中的多个绘图获得动画,例如使用像您所做的那样的for循环,那么您将会感到失望。

它只会执行所有绘图并一次性显示 。无需同时绘制200个矩形,您只需要绘制1个矩形并更新其位置。

要执行动画,如果您打算执行更复杂的操作,则需要计时器(您可以尝试javax.swing.timer)或循环。您可以在更新矩形的位置时实现无限循环并在循环中执行渲染。

最终,无论采用哪种方法。您需要存储矩形的位置。以如下方式更新并呈现它:

update position
render
update position
render
update position
render

而非

update position
update position
update position
render
render
render

带计时器的动画示例: Repainting/refreshing the JFrame

使用循环制作动画示例:

while(running){
    update();     //update position of your rect
    repaint();    //redraw your rect (and all other stuff)
}